1. 方法一:转载:https://www.jianshu.com/p/4b037374b1ec

 let fruits =
    [{
      name: 'apple',
      value: 1
    },
    {
      name: 'apple',
      value: 2
    }, // 总计3个苹果
    {
      name: 'banana',
      value: 2
    },
    {
      name: 'banana',
      value: 3
    }]; // 总计5个香蕉

  let fruitTotal = [];  // 存最终数据结果

  // 数据按照水果名称进行归类
  let nameContainer = {}; // 针对键name进行归类的容器
  fruits.forEach(item => {
    nameContainer[item.name] = nameContainer[item.name] || [];
    //当逻辑或||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。
    nameContainer[item.name].push(item);
  });

  console.log(nameContainer, 'nameContainer'); // 按照水果名称归类完成:{ apple: Array(2), banana: Array(2) }

  // 统计不同种类水果的数量
  let fruitName = Object.keys(nameContainer); // 获取水果种类:["apple", "banana"]
  console.log(fruitName, 'fruitName')
  fruitName.forEach(nameItem => {
    let count = 0;
    nameContainer[nameItem].forEach(item => {
      count += item.value; // 遍历每种水果中包含的条目计算总数
    });
    fruitTotal.push({ 'name': nameItem, 'total': count });
  });

  console.log(fruitTotal);
  // 输出结果:
  // [{ name: "apple", total: 3 },
  //  { name: "banana", total: 5 }]
  //筛选含有同一个属性的值,存放在一个数组对象里
  1. 方法二:利用数组Array.reduce函数处理,代码更加简洁

let fruits2 =
    [{
      name: 'apple',
      value: 0.1
    },
    {
      name: 'apple',
      value: 0.2
    },
    {
      name: 'banana',
      value: 0.3
    },
    {
      name: 'banana',
      value: 0.4
    }];
  let oldArray = JSON.parse(JSON.stringify(fruits2))
  let newArray = []
  newArray = oldArray.reduce((total, cur, index) => {
    if (total) {
      let hasValue = total.findIndex(current => {
        return current.name === cur.name
      })
      // total 中不包含这一项,则push到数组
      hasValue === -1 && total.push(cur)
      // total 中包含这项,则累加需要统计的数值
      hasValue !== -1 && (total[hasValue].value = (total[hasValue].value.toFixed(2) * 10 + cur.value.toFixed(2) * 10) / 10)
      return total
    }
  }, [])

  console.log(newArray)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐