在数组中组合类似的对象

Combine Like Objects Within Array

本文关键字:对象 组合 数组      更新时间:2023-09-26

我正在根据一系列订单生成税务报告。本质上,我需要转换以下数组:

    [
  {
    "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');