在数组中组合类似的对象
Combine Like Objects Within Array
我正在根据一系列订单生成税务报告。本质上,我需要转换以下数组:
[
{
"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)创建该输出呢?
不需要
库,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));
做这项工作,但严重混淆。
这
看起来像是lodash _.groupBy()
的完美用途(见文档)
var processed = _.groupBy(original, 'code');
相关文章:
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 使用下划线将键和值的两个数组合并到一个对象中
- 通过组合变量在解析JSON时访问随机对象
- 将字符串与 JSON 对象组合以返回数据
- 获取对象的所有可能组合,其中值的总和与数字匹配
- 在键值对的唯一组合上合并对象
- 如何将 LARGE jQuery 对象的数组合并为一个
- 不同对象之间的递归,并将它们唯一地组合在一起,不重复
- js组合对象只返回一个id
- AngularJS,如何将多个输入组合到一个ng模型中?具体来说,将日期、时间和时区输入组合到日期时间对象中
- 组合对象
- 如何将数组的对象与同一索引组合
- 如何在JQuery/Javascript中从数据表单元访问复杂的对象组合
- 如何在没有空函数的情况下用javascript实现对象组合
- 将对象组合到两个不同的数组javascript中
- javascript对象组合语法
- 将JavaScript对象组合在一个具有相同键值的数组中
- 将数组对象组合成单个对象
- 将不同的 JavaScript 对象组合在一个对象中
- 对javascript对象进行排序,并将对象组合成一个数组