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();
}
}