【问题标题】:How to filter and calculate same object array value in Javascript如何在Javascript中过滤和计算相同的对象数组值
【发布时间】:2018-02-20 05:54:18
【问题描述】:

例如我有这个对象数组

const purchases = [
  {
    name: 'a',
    price: 500
  },
  {
    name: 'a',
    price: 1000
  },
  {
    name: 'b',
    price: 500
  },
  {
    name: 'b',
    price: 500
  }
]

如何通过purchase.name有效过滤和计算,创建输出可以是这样的

let filteredPurchases = [
  {
    name: 'a',
    price: 1500  
  },
  {
    name: 'b',
    price: 1000  
  }
]

【问题讨论】:

  • 我已经尝试过代码和搜索相关问题,mdn,但我不想分享我的失败代码

标签: javascript arrays object filter


【解决方案1】:

您可以将array#reduceObject.values() 一起使用,根据name 值对数据进行分组,并在对象中为相同的name 添加price,然后提取所有值。

const purchases = [ { name: 'a', price: 500 }, { name: 'a', price: 1000 }, { name: 'b', price: 500 }, { name: 'b', price: 500 } ],
      result = Object.values(purchases.reduce((r,{name, price}) => {
        r[name] = r[name] || {name, price : 0};
        r[name].price += price;
        return r;
      },{}));
console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用Array#reduce 和用于保留索引的对象引用来做一些简单的事情。

    const purchases = [{
        name: 'a',
        price: 500
      },
      {
        name: 'a',
        price: 1000
      },
      {
        name: 'b',
        price: 500
      },
      {
        name: 'b',
        price: 500
      }
    ];
    
    // object for keeping index
    const ref = Object.create(null);
    
    let res = purchases
      // iterate over the array
      .reduce((arr, o) => {
        // check index already defined, if defined add price value
        if (o.name in ref) arr[ref[o.name]].price += o.price;
        // if not then define index and insert a new object with all property of object
        else arr[ref[o.name] = arr.length] = Object.assign({}, o);
        // return the array reference
        return arr;
        // set initial value as an array for result
      }, [])
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      const purchases = [
        {
          name: 'a',
          price: 500
        },
        {
          name: 'a',
          price: 1000
        },
        {
          name: 'b',
          price: 500
        },
        {
          name: 'b',
          price: 500
        }
      ];
      var result = []
      function findSum(array, key) {
        let sum = 0;
        array.forEach(function(element) {
          if(key == element.name) {
            sum = sum + element.price;
          }   
        });
        return sum;
      }
      purchases.forEach(function(element) { 
        let sum = findSum(purchases, element.name);       
        result[element.name] =({name:element.name,price:sum});   
      });
      console.log("Result obj")
      console.log(Object.values(result));

      【讨论】:

        【解决方案4】:

        您可以创建中间映射来对项目的价格求和,然后对其进行迭代以创建所需的结果:

        const purchases = [{
            name: 'a',
            price: 500
          },
          {
            name: 'a',
            price: 1000
          },
          {
            name: 'b',
            price: 500
          },
          {
            name: 'b',
            price: 500
          }
        ];
        
        const mapped = purchases.reduce((result, item) => {
          if (!result[item.name]) {
            result[item.name] = item.price;
          } else {
            result[item.name] = result[item.name] + item.price;
          }
          return result;
        }, {});
        
        const result = Object.keys(mapped).map(key => {
          return {
            name: key,
            price: mapped[key]
          };
        });
        
        console.log(result);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-30
          • 1970-01-01
          • 2021-04-23
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多