【问题标题】:Javascript create new array from given arrayJavascript从给定数组创建新数组
【发布时间】:2018-05-22 08:02:06
【问题描述】:

我有一个包含 num 和 sum 的对象数组

[
   {num: 1, sum: 10},
   {num: 1, sum: 2},
   {num: 1, sum: 3},
   {num: 2, sum: 1},
   {num: 2, sum: 40},
   {num: 2, sum: 100},
   {num: 3, sum: 0},
   {num: 4, sum: 0},
]

我想要的是:

[
   {1: {count: 3, totalSum: 15},
   {2: {count: 3, totalSum: 141},
   {3: {count: 1, totalSum: 0},
   {4: {count: 1, totalSum: 0},
]

非常感谢任何帮助

【问题讨论】:

  • 邮政编码示例,你尝试了多远
  • 到目前为止你尝试了什么?给我们看一些代码
  • 您想要的结构无效,您打开了大括号,但从未关闭。
  • 你确定那是你想要的输出吗?拥有一个键为 1、2、3、4 的对象不是更好吗?
  • 结果结构也没有多大意义。为什么要使用num 作为嵌套对象的键?

标签: javascript arrays object ecmascript-6 merge


【解决方案1】:

一种选择是将reduce 放入由nums 索引的对象中,然后将map 该对象放入一个数组中:

const input=[{num:1,sum:10},{num:1,sum:2},{num:1,sum:3},{num:2,sum:1},{num:2,sum:40},{num:2,sum:100},{num:3,sum:0},{num:4,sum:0},]
const outputObj = input.reduce((a, { num, sum }) => {
  if (!a[num]) a[num] = { count: 0, totalSum: 0 };
  a[num].count++;
  a[num].totalSum += sum;
  return a;
}, {});
const output = Object.entries(outputObj)
  .map(([key, val]) => ({ [key] : val }));
console.log(output);

【讨论】:

  • 这是一个有趣的解决方案:groupingcounting 在同一个函数中。恭喜。
【解决方案2】:

您可以使用reduce 方法对数组进行分组,然后使用另一个reduce 方法来查找每个键的counttotalSum 属性。

let arr = [ {num: 1, sum: 10}, {num: 1, sum: 2}, {num: 1, sum: 3}, {num: 2, sum: 1}, {num: 2, sum: 40}, {num: 2, sum: 100}, {num: 3, sum: 0}, {num: 4, sum: 0}, ]

var groupBy = function(arr, key) {
  return arr.reduce(function(acc, x) {
    (acc[x[key]] = acc[x[key]] || []).push(x);
    return acc;
  }, {});
};

let grouped = groupBy(arr, 'num');

let result = Object.keys(grouped).reduce(function(acc, key){
  let obj ={ [key] :  {count : grouped[key].length, totalSum: grouped[key].map(a => a.sum).reduce((a,b) => a + b)}}
  acc.push(obj)
  return acc;
},[]);
console.log(result);

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多