我正在根据一系列订单生成税务报告。基本上我需要转换以下数组:
[
{
"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
}
]
进入每个类的单独数组" 代码",其中类" 代码"可以等于任何东西,并且可以有任何数量的那种类型。所以它看起来像这样:
[
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)创建输出?
答案 0 :(得分:4)
不需要图书馆,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));
完成工作,但严重混淆。
答案 1 :(得分:-1)
这看起来非常适合lodash _.groupBy()
(see doc)
var processed = _.groupBy(original, 'code');