将对象数组中的所有数据汇总到新的对象数组中

新手上路,请多包涵

我有一组看起来像这样的对象:

 var data = [
    { costOfAirtickets: 2500, costOfHotel: 1200 },
    { costOfAirtickets: 1500, costOfHotel: 1000 },
]

我想对数组中的每个元素求和以生成如下数组:

 var result = [ { costOfAirtickets: 4000, costOfHotel: 2200 } ]

我使用了 map 和 reduce 函数,但我只能像这样对单个元素求和:

 data.map(item => item.costOfAirtickets).reduce((prev, next) => prev + next); // 22

目前这会产生一个单一的值,这不是我最初解释时想要的。

有没有办法用 Javascript 或可能使用 lodash 来做到这一点。

原文由 Dave Kalu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 303
2 个回答

使用 for..in 迭代对象和 reduce 迭代数组

 var data = [{costOfAirtickets: 2500, costOfHotel: 1200},{costOfAirtickets: 1500, costOfHotel: 1000}];

var result = [data.reduce((acc, n) => {
  for (var prop in n) {
    if (acc.hasOwnProperty(prop)) acc[prop] += n[prop];
    else acc[prop] = n[prop];
  }
  return acc;
}, {})]
console.log(result)

原文由 Chris Li 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 Lodash 简化您的生活。

 const _ = require('lodash')
let keys = ['costOfAirtickets', 'costOfHotel'];
let results = _.zipObject(keys, keys.map(key => _.sum( _.map(data, key))))
...
{ costOfAirtickets: 4000, costOfHotel: 2200 }

解释:

  • _.sum(_.map(data, key)) :生成每个数组的总和
  • _.zipObject : 用数组总和压缩结果
  • 使用 keys.map() 每个键的总和 _.map 不保证顺序。

文档:

  • 总和: https ://lodash.com/docs/4.17.10#sum
  • 压缩对象: https ://lodash.com/docs/4.17.10#zipObject
  • 地图: https ://lodash.com/docs/4.17.10#map

原文由 Roopak A Nelliat 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题