ES6对象数组按照某个对象属性值分组汇总及排序方法

概要

我们使用new Set方法对数据进行去重,并通过array.from将其重新转化为数组。

排序我们借助于Array.sort方法实现 

使用示例

                        let data = res.data;
                        
                        //数据处理:按f_jdmc分组汇总数据 解决接口中f_jdmc重复问题
                        let data2=[];
                        let jdmcs =data.map(item=>{return item.f_jdmc});
                        unique(jdmcs).forEach(function(item,i){
                            let fxsms=data.map(obj => {if(obj.f_jdmc==item){return Number(obj['f_fxsm'])}else{return 0;}});
                            let json={
                                    f_jdmc:item,
                                    f_fxsm:fxsms.reduce((n,m)=>n+m)
                            }
                            data2.push(json);
                        })
                        //data2按照f_fxsm大小排序
                        data2.sort(compare("f_fxsm","asc"));

关键代码

        //数组去重
	 	function unique(arr){
	 		return Array.from(new Set(arr));
	 	}
	 	
	 	//对象数组排序(日期、数值类)
	 	var compare = function (property,type) {
			type=type?type:"asc"
			var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
			var regExp = new RegExp(reg);
			var isDateType=false;
			return function (a, b) {
				var value1 = a[property];
			    var value2 = b[property];
				isDateType=isDateType?isDateType:regExp.test(value1);
			    if(type=="asc"){
					if(isDateType){
						return Date.parse(value1) - Date.parse(value2);
					}else{
						return value1 - value2;
					}
					
				}else{
					if(isDateType){
						return Date.parse(value2) - Date.parse(value1)
					}else{
						return value2 - value1;
					}
				}	
			}
		}

//对象数组排序(文本类)
 function compare(propertyName,order) { 
    return function (object1, object2) { 
        var value1 = object1[propertyName]; 
        var value2 = object2[propertyName]; 
        if(order==0){
            if (value2 < value1) { 
                return -1; 
            } 
            else if (value2 > value1) { 
                return 1; 
            } 
            else { 
                return 0; 
            } 
        }if(order==1){
            if (value2 > value1) { 
                return -1; 
            } 
            else if (value2 < value1) { 
                return 1; 
            } 
            else { 
                return 0; 
            } 
        }
        
    } 
} 	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值