javascript - 减少对象数组并返回对象的所有原始属性
问题描述
我有一个对象数组,每个对象有 4 个属性,如下所示:
let arr = [
{name: john, lastName: smith, counter:1, city: New York}
{name: john, lastName: smith, counter:1, city: New York}
{name: emilio, lastName: kouri, counter:1, city: euy}
{name: john, lastName: smith, counter:1, city: New York}
]
我想减少它以返回它(总和计数器)
[{name: emilio, lastName: kouri, counter:1, city: euy}
{name: john, lastName: smith, counter:3, city: New York}]
这是我现在使用的代码,它正确地减少了它,但只返回 [counter, name],我希望它返回每个对象的所有四个属性,怎么做?
let counts = arr.reduce((prev, curr) => {
let count = prev.get(curr.name) || 0;
prev.set(curr.name, curr.counter + count);
return prev;
}, new Map());
let reducedObjArr = [...counts].map(([key, value]) => {
return {key, value}
})
console.log('reducido',reducedObjArr);
解决方案
您只需要一个reduce
没有嵌套语句的map
语句:
let arr = [{
name: "john",
lastName: "smith",
counter: 1,
city: "New York"
}, {
name: "john",
lastName: "smith",
counter: 1,
city: "New York"
}, {
name: "emilio",
lastName: "kouri",
counter: 1,
city: "euy"
}, {
name: "john",
lastName: "smith",
counter: 1,
city: "New York"
}];
let counts = arr.reduce((acc, curr) => {
if (!acc.some(({ name }) => name == curr.name)) {
acc.push(curr);
} else {
acc.find(({ name }) => name == curr.name).counter++;
}
return acc;
}, []);
console.log(counts);