在数组

时间:2016-01-17 23:26:04

标签: javascript arrays node.js object

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

    [
  {
    "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)创建输出?

2 个答案:

答案 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');