/**
* 分组统计
* @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);
};
JS实现像sql一样分组统计
于 2022-11-24 14:31:15 首次发布