我正在根据一系列订单生成税务报告。本质上我需要转换以下数组:
[
{
"rate": 6.75,
"code": "US-NC-Guilford-27409",
"grand": 39.981625,
"tax": 2.02
},
{
"rate": 7.5,
"code": "US-NC-Orange-27516",
"grand": 186.25,
"tax": 11.25
},
{
"rate": 7.5,
"code": "US-NC-Orange-27516",
"grand": 29.19625,
"tax": 1.5
}
]
放入每个类“code”的单独数组中,其中类“codes”可以等于任何内容,并且可以具有任意数量的该类型。所以它看起来像这样:
[
US-NC-Guilford-27409:[
{
"rate":6.75,
"code":"US-NC-Guilford-27409",
"grand":39.981625,
"tax":2.02
}
],
US-NC-Orange-27516:[
{
"rate":7.5,
"code":"US-NC-Orange-27516",
"grand":186.25,
"tax":11.25
},
{
"rate":7.5,
"code":"US-NC-Orange-27516",
"grand":29.19625,
"tax":1.5
}
]
]
但我完全愿意接受其他格式化分离数据的方法,但是在生成报告时,我们必须提供每个税级的订单日志。
那么如何使用 JavaScript (Node) 创建该输出?
最佳答案
不需要图书馆,Array.prototype.reduce做的工作:
var data = [
{
"rate": 6.75,
"code": "US-NC-Guilford-27409",
"grand": 39.981625,
"tax": 2.02
},
{
"rate": 7.5,
"code": "US-NC-Orange-27516",
"grand": 186.25,
"tax": 11.25
},
{
"rate": 7.5,
"code": "US-NC-Orange-27516",
"grand": 29.19625,
"tax": 1.5
}
]
var codes = data.reduce(function(acc, obj) {
if (!acc.hasOwnProperty(obj.code)) acc[obj.code] = [];
acc[obj.code].push(obj);
return acc;
}, {});
document.write(JSON.stringify(codes));
编辑
根据Xotic750的建议,hasOwnProperty测试可以简化为:
var codes = data.reduce(function(acc, obj) {
if (!acc[obj.code]) acc[obj.code] = [];
acc[obj.code].push(obj);
return acc;
}, Object.create(null));
可以进一步压缩为:
var codes = data.reduce(function(acc, obj) {
return (acc[obj.code] || (acc[obj.code] = [])) && acc[obj.code].push(obj) && acc;
}, Object.create(null));
尽管对于可维护的代码我不建议这样做。如果您喜欢 ES6 箭头函数,那么:
var codes = data.reduce((acc, obj) => (acc[obj.code] || (acc[obj.code] = [])) && acc[obj.code].push(obj) && acc, Object.create(null));
完成了工作,但被严重混淆了。
关于javascript - 组合数组中相似的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845044/