js实现sql中的groupby 功能,并提供几个聚合函数

var groupBy ={
group:function (fields,groupBy,aggregate)
{ var initval = {};
return fields.reduce((pre,current)=>this.mygroup(pre,current,groupBy,aggregate),initval);
},
count:function(pre,field){
pre = pre?pre:0;
return pre+1;
},
mygroup:function (pre,row,groupBy,aggregate){
var keys = [];
var vals = {};
groupBy.forEach(function (e,i){
keys.push(row[e]);
vals[e] = row[e];
});
var key = keys.join("|");
if(!pre[key])
{
pre[key]=vals;
}
for(e in aggregate)
{
pre[key][e]= aggregate[e](pre[key][e],row[e]);
}

return pre;
},
sum:function (pre,field){
pre = pre?pre:0;
return parseFloat(pre)+parseFloat(field);
},
avg:function avg(pre,field){
pre = pre?pre:0;
return parseFloat(pre)+parseFloat(field);
},
max:function (pre,field){
pre = pre?pre:0;
return pre>field?pre:field;
},
min:function (pre,field){
pre = pre?pre:field;
return pre<field?pre:field;
},
concat:function (pre,field){
pre = pre?pre:'';
return pre.toString()+field.toString();
}
}

写这段代码的目的呢,有两个,第一个是实现在前端页面对数据进行groupby,第二个就是练习我对函数式编程的理解。我不是一个前端程序员,学习函数式编程模式,主要是为了提高自己平时写代码的内聚性和降低耦合,减少代码复制。代码中有使用了一处for,这个在纯函数式编程中,是不能有的。另外,这个版本还有一个问题,就是avg求出来的值是不对的,暂时没有想好avg应该如何实现。

PS:新修改版本

不知道这样实现avg是不是最好的办法,实现的结果一定是对的

var groupBy ={
group:function (fields,groupBy,aggregate)
{ var initval = {};
return fields.reduce((pre,current,index)=>this.mygroup(pre,current,groupBy,aggregate,index),initval);
},
count:function(pre,field,index){
return index+1;
},
mygroup:function (pre,row,groupBy,aggregate,index){
var keys = [];
var vals = {};
groupBy.forEach(function (e,i){
keys.push(row[e]);
vals[e] = row[e];
});
var key = keys.join("|");
if(!pre[key])
{
pre[key]=vals;
}
for(e in aggregate)
{
pre[key][e]= aggregate[e](pre[key][e],row[e],index);
}

return pre;
},
sum:function (pre,field){
pre = pre?pre:0;
return parseFloat(pre)+parseFloat(field);
},
avg:function avg(pre,field,index){
pre = pre?pre:0;
return (parseFloat(pre)*(index)+parseFloat(field))/(index+1); 
},
max:function (pre,field){
pre = pre?pre:0;
return pre>field?pre:field;
},
min:function (pre,field){
pre = pre?pre:field;
return pre<field?pre:field;
},
concat:function (pre,field){
pre = pre?pre:'';
return pre.toString()+field.toString();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值