class Query{
constructor(data) {
this._data=data;
this._cacheFn=[];
}
where(callback){
const cacheFn=function (data){
return data.filter(item=>callback(item));
}
this._cacheFn.push(cacheFn)
return this
}
sortBy(key){
const cacheFn = function(data){
data.sort((a,b)=>a[key]-b[key]);
return data
}
this._cacheFn.push(cacheFn)
return this;
}
groupBy(key){
const cacheFn=function(data){
return data.reduce((acc,cur)=>{
if(!Array.isArray(acc[cur[key]])){
acc[cur[key]]=[];
}
acc[cur[key]].push(cur);
return acc
},{})
}
this._cacheFn.push(cacheFn)
return this;
}
execute(){
let res =this._data;
while (this._cacheFn.length){
res=this._cacheFn.shift()(res);
}
return res;
}
}
function query(data){
return new Query(data);
}
const data =[{id:23,name:"xigua"},{id:56,name:"xiangjiao"},{id:48,name:"lizi"},{id:11,name:"xigua"},{id:9,name:"pingguo"}];
const res=query(data)
.where(item=>item.id>10)
.sortBy("id")
.groupBy("name")
.execute();
console.log(res)