按“组”对二维数组求和

IT技术 javascript arrays sum
2021-03-11 10:22:18

我有一个数组形式

[
['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个回答

使用reduce()to sum 并将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);                                                             

这是一种“就地”计算总和的方法,避免了必须使用 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)函数参数解构它接受第一个参数,假设它是一个数组,并将第一个元素分配给key,将第二个元素分配num这比在代码中引用a[0]a[1]从代码中引用要干净一些