为了账号安全,请及时绑定邮箱和手机立即绑定

怎么对一组数据按照某个特定字段进行分组?

怎么对一组数据按照某个特定字段进行分组?

收到一只叮咚 2019-05-13 13:41:48
比如我有一组数据[{'time':'2018-03-01','data':1,},{'time':'2018-02-02','data':2,},{'time':'2018-01-01','data':3,},{'time':'2017-12-01','data':4,},{'time':'2017-11-02','data':5,},{'time':'2016-10-01','data':6,},{'time':'2016-9-01','data':7,}]实际业务场景是对这组数据进行分组,每5条一组但是这5条还要根据他们的日期年份分小组比如上面这7条分出来结果就是:[{section:1,sectionDatas:[{date:'2018',datas:[{'time':'2018-03-01','data':1,},{'time':'2018-02-02','data':2,},{'time':'2018-01-01','data':3,}]},{date:'2017',datas:[{'time':'2017-12-01','data':4,},{'time':'2017-11-02','data':5,}]}]},{section:2,sectionDatas:[{date:'2016',datas:[{'time':'2016-10-01','data':6,},{'time':'2016-9-01','data':7,}]}]}]这个算法该怎么写呢。。求指教
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

步骤
*第一步:排序,时间从近到远*第二步:分割,将数组分成5个一组,返回新数组*第三步:抽离,将相同时间抽离出来组成要求上的数据格式
代码
第一步:排序
varcompare=function(prop){
returnfunction(obj1,obj2){
varval1=obj1[prop];
varval2=obj2[prop];
if(!isNaN(Number(val1))&&!isNaN(Number(val2))){
val1=Number(val1);
val2=Number(val2);
}
if(val1return1;
}elseif(val1>val2){
return-1;
}else{
return0;
}
}
}
//用法
arr.sort(compare("time"))
第二步:分割
//分割
Array.prototype.chunk=function(size){
vararray=this;
constlength=array.length
if(!length||!size||size<1){
return[]
}
letindex=0
letresIndex=0
letresult=newArray(Math.ceil(length/size))
while(indexresult[resIndex++]=array.slice(index,(index+=size))
}
returnresult
}
//用法
arr.chunk(5)
第三步:抽离
//抽离
functionsortArr(arr,str){
var_arr=[],
_t=[],
//临时的变量
_tmp;
//按照特定的参数将数组排序将具有相同值得排在一起
arr=arr.sort(function(a,b){
vars=a[str],
t=b[str];
returns});
if(arr.length){
//_tmp=arr[0][str];
_tmp=newDate(arr[0][str]).getFullYear()
}
//将相同类别的对象添加到统一个数组
for(leti=0;iif(newDate(arr[i][str]).getFullYear()===_tmp){
//if(arr[i][str]===_tmp){
_t.push(arr[i]);
}else{
_tmp=newDate(arr[i][str]).getFullYear();
_arr.push(_t);
_t=[arr[i]];
}
}
//将最后的内容推出新数组
_arr.push(_t);
return_arr;
}
//用法,这里仅对一维数组使用
sortArr(arr,'time')
//我将数据一二步处理后开始二叉数循环
varcc=arr.sort(compare("time")).chunk(5)
var_cc=[]
for(leti=0;i//抽离
var_datas=sortArr(cc[i],'time')
//根据所给数据结构进行赋值
_cc.push({section:i+1,sectionDatas:[]})
for(leto=0;o<_datas.length;o++){
_cc[i].sectionDatas.push({
data:newDate(_datas[o][0].time).getFullYear(),
datas:[]
})
}
for(letp=0;p<_cc[i].sectionDatas.length;p++){
_cc[i].sectionDatas[p].datas=sortArr(cc[i],'time')[p]
}
}
最近刚研究的函数式编程
功力不够,谨慎使用
classFunctor{
constructor(data){
this.data=data
}
map(data){
returnnewFunctor(data)
}
//排序
compare(prop){
varresult=this.data.sort(function(obj1,obj2){
varval1=obj1[prop];
varval2=obj2[prop];
if(!isNaN(Number(val1))&&!isNaN(Number(val2))){
val1=Number(val1);
val2=Number(val2);
}
if(val1return1;
}elseif(val1>val2){
return-1;
}else{
return0;
}
})
returnthis.map(result)
}
//分割
chunk(size){
vararray=this.data;
//获取数组的长度,如果你传入的不是数组,那么获取到的就是undefined
constlength=array.length
//判断不是数组,或者size没有设置,size小于1,就返回空数组
if(!length||!size||size<1){
return[]
}
//核心部分
letindex=0//用来表示切割元素的范围start
letresIndex=0//用来递增表示输出数组的下标
//根据length和size算出输出数组的长度,并且创建它。
letresult=newArray(Math.ceil(length/size))
//进行循环
while(index//循环过程中设置result[0]和result[1]的值。该值根据array.slice切割得到。
result[resIndex++]=array.slice(index,(index+=size))
}
//输出新数组
//returnresult
returnthis.map(result)
}
//抽离
sortArr(arr,str){
var_arr=[],
_t=[],
//临时的变量
_tmp;
//按照特定的参数将数组排序将具有相同值得排在一起
arr=arr.sort(function(a,b){
vars=a[str],
t=b[str];
returns});
if(arr.length){
//_tmp=arr[0][str];
_tmp=newDate(arr[0][str]).getFullYear()
}
//将相同类别的对象添加到统一个数组
for(leti=0;iif(newDate(arr[i][str]).getFullYear()===_tmp){
//if(arr[i][str]===_tmp){
_t.push(arr[i]);
}else{
_tmp=newDate(arr[i][str]).getFullYear();
_arr.push(_t);
_t=[arr[i]];
}
}
//将最后的内容推出新数组
_arr.push(_t);
return_arr;
}
//转指定json格式
dataToJSON(){
var_json=[]
var_this=this;
this.data.forEach(function(item,i){
var_datas=_this.sortArr(item,'time')
_json.push({section:i+1,sectionDatas:[]})
for(leto=0;o<_datas.length;o++){
_json[i].sectionDatas.push({
data:newDate(_datas[o][0].time).getFullYear(),
datas:[]
})
}
for(letp=0;p<_json[i].sectionDatas.length;p++){
_json[i].sectionDatas[p].datas=_datas[p]
}
})
return_json
}
}
Functor.of=function(data){
returnnewFunctor(data)
}
使用方法
Functor.of(a).compare("time").chunk(5).dataToJSON()//返回一个新的值,不改变原来数据
                            
查看完整回答
反对 回复 2019-05-13
?
慕森王

TA贡献1777条经验 获得超3个赞

vararr=newObject
data.forEach(function(d){
varyear=newDate(d.time).getFullYear()
if(arr[year]){
arr[year].push(d)
}else{
arr[year]=[d]
}
})
提供个思路,修改一下应该能用
                            
查看完整回答
反对 回复 2019-05-13
  • 2 回答
  • 0 关注
  • 323 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信