JS实现像sql一样分组统计

 /**
 * 分组统计
 * @param datas 数据集合
 * @param keys 分组键值
 * @param callback 回调函数(例如求和还是计算总数)
 * @returns {{}}
 */
 function  GroupBy(datas,keys,callBack) {
  const list = datas || []; //数组对象
  const groups = [];
   //数组遍历  v是 数组里的一个对象 比如{name:'张三',value:1}  取值要v.name ='张三'
  list.forEach(v => {
      const key = {}; //{name:'张三',value:1}
      //keys  ['name','value'] 
      keys.forEach(k => {
          key[k] = v[k]; //赋值
      });
      //查找相同的分组 第一次肯定是找不到
      let group = groups.find(v => {
          return v._key === JSON.stringify(key);
      });
      if (!group) {
          group = {
              _key:JSON.stringify(key), //只有字符串才可以比对 ===
              key: key,
          };
          groups.push(group);
      }
      //是否有回调函数
      if(callBack){
        //v是 数组里的一个对象 比如{name:'张三',value:1}  取值要v.name ='张三'
          group.data = callBack(group.data,v);  //group.data 附一个属性值,比如求和数值  sum
          group.total=group.total||0;//统计  count
          group.total++;
      }else {
          group.data=group.data||[];
          group.data.push(v);
      }
  });
  return groups;
}
      

      window.onload=function () {
            const data = [
            { "name":"zs",  "sex":"女",  "class":2,  "score":80 },
            { "name":"ls",  "sex":"男",   "class":1,  "score":85 },
            {  "name":"ww",  "sex":"女",  "class":1,  "score":83 },
            {  "name":"xq",  "sex":"女", "class":2,  "score":95 },
            {  "name":"ld", "sex":"男",   "class":2, "score":81 }
       ];
            var d = GroupBy(data,['sex','class'],(d,v)=> {
                d = d||0;
                return d+=v.score;
            });
            console.log(d);
            var a = GroupBy(data,['sex','class']);
            console.log(a);
        };

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光浅止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值