我有一个
形式的数组[
['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的数组缩减,但我不确定如何使用它来实现这种效果
答案 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]
要简洁一些。