【问题标题】:Reduce an array of objects and return all the original properties of the object减少对象数组并返回对象的所有原始属性
【发布时间】:2019-03-19 06:24:17
【问题描述】:

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

这是我现在使用的代码,它正确地减少了它但只返回[计数器,名称],我希望它返回每个对象的所有四个属性,怎么做?

  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); 

【问题讨论】:

    标签: javascript reduce


    【解决方案1】:

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

    【讨论】:

    • 没问题@SvenBrodersen。
    【解决方案2】:

    您可以获取计数为零的对象的副本,然后递增该对象并设置该对象。

    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((prev, curr) => {
        let item = prev.get(curr.name) || Object.assign({}, curr, { counter: 0 });
        item.counter += curr.counter;
        return prev.set(curr.name, item);
    }, new Map);
    
    let reducedObjArr = [...counts.values()]
    
    console.log('reducido', reducedObjArr);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多