首页 > 解决方案 > 减少对象数组并返回对象的所有原始属性

问题描述

我有一个对象数组,每个对象有 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); 

标签: javascriptreduce

解决方案


您只需要一个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);


推荐阅读