通过" group"对2D数组求和

时间:2016-01-08 13:32:26

标签: javascript arrays sum

我有一个

形式的数组
[
['16-24', 192081],
['16-24', 94452],
['16-24', 1055],
['25-34', 192081],
['25-34', 94452],
['25-34', 1055],
...
]

我在数组中有很多项目,我希望减少到唯一的左手条目。这是我希望减少到

的一个例子
[
['16-24', 287588],
['25-34', 287588],
...
]

显然这里的数字是一个人为的例子。我已经查看了javascript的数组缩减,但我不确定如何使用它来实现这种效果

2 个答案:

答案 0 :(得分:1)

使用reduce()求和,map()将其更改为您想要的格式。



var vals = [
['16-24', 192081],
['16-24', 94452],
['16-24', 1055],
['25-34', 192081],
['25-34', 94452],
['25-34', 1055]
];

var temp = vals.reduce(function (obj, cur) {
    var total = obj[cur[0]] || 0;
    obj[cur[0]] = total + cur[1];
    return obj;
}, {} );

var result = Object.keys(temp).map( function (key) { return [key, temp[key]]; });
console.log(result);                                                             




答案 1 :(得分:1)

这是一种计算“就地”总和的方法,避免了必须使用reduce等创建单独的对象,然后将对象转换回数组。

基本计划是在每个键的第一次出现时添加后续出现的数字,然后过滤掉后续出现的数字。

function sum(a) {
  return a.filter(([key, num], idx) => {
    var first = a.findIndex(([key2]) => key === key2);
    if (first === idx) return true;
    a[first][1] += num;
  });
}

对于每个元组,我们使用findIndex来查找具有相同键的第一个元组。通过将该索引与当前索引进行比较,我们可以判断当前元组是否是第一次出现。如果是,我们不管它(return true;);否则,我们将其过滤掉,但首先将其值添加到第一次出现。这避免了必须使用reduce等创建对象,然后将对象转换回数组。

可能不熟悉的语法([key, num], idx)function parameter destructuring。它接受第一个参数,假设它是一个数组,并将第一个元素分配给key,将第二个元素分配给num。这比在代码中引用a[0]a[1]要简洁一些。