js实现分类统计(利用数组Array.reduce函数)

  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)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值