请教关于这个对象数组去重的优化?

游龙翔隼
  • 1.3k

今天做一个对象数组去重的东西,结构如下:

clipboard.png
如果arrv_Airpt_Cd和dpt_AirPt_Cd相同则认为是相同数据,需要去重。

一开始直接遍历数组对象进行操作,发现性能很差,上千条数据就会宕浏览器,
然后转换了下思路,直接遍历操纵对象的话会连续交换内存地址导致变卡(我猜测的,不知道原理,大佬们知道的话还请说明),所以选择了使用字符串数组代替原始数组,就能跑起来了,代码如下:

        clearRepeat(){
            let _this = this;
            let olist = _this.flyList.data; //原始数据,对象型数组
            let aresult = [olist[0].dpt_AirPt_Cd + '-' +  olist[0].arrv_Airpt_Cd];
            let oresult = [];
            for(let item of olist){     //提取对象中的信息,以-间隔,生成字符串数组
                oresult.push(item.dpt_AirPt_Cd + '-' + item.arrv_Airpt_Cd);
            }
            for(let item of oresult){   //去重后放入aresult
                if(aresult.indexOf(item)<0 ) aresult.push(item);
            }
            _this.mapLines.data = aresult.map(function (val) {      //转换
                return {
                    from: val.split('-')[0],
                    to: val.split('-')[1]
                };
            })
            oresult.length = 0;
            aresult.length = 0;                
        },

请问还可以怎么优化

回复
阅读 1.5k
5 个回答

这种问题应该交给后端处理,因为数据量稍微有点大,放前端处理肯定影响性能

根据 item.dpt_AirPt_Cd 和 arrv_Airpt_Cd 为条件去重,返回去重后的数组

var fnDuplicateRemover = function(list) {
    var newlist = [], hash = {};
    for (var i = 0,list_length=list.length; i < list_length; i++) {
        var item = list[i];
        var key = item.dpt_AirPt_Cd + '/' + item.arrv_Airpt_Cd;
        if (!hash[key]) {
            newlist.push(hash[key] = item);
        }
    }
    return newlist;
};
function clearRepeat(ary){
        var obj={};
        var reslut=ary.filter(function(item){
             var key=item.dpt_AirPt_Cd + '-' + item.arrv_Airpt_Cd;
             obj[key]==undefined?(obj[key]=1):(obj[key]++)
             return obj[key]==1;
            })       
        return  reslut;
}

逻辑是这样 没试过
这样写的话加个参数clearRepeat(ary,count)还可以判断重复多少次之后的去掉
如下

function clearRepeat(ary,index){
        var index=index||1;
        var obj={};
        var reslut=ary.filter(function(item){
             var key=item.dpt_AirPt_Cd + '-' + item.arrv_Airpt_Cd;
             obj[key]==undefined?(obj[key]=1):(obj[key]++)
             return obj[key]<=index;
            })       
        return  reslut;
}

我尝试了一下用hash的方式来去重。
我对性能没有多少研究,不知道会不会有什么问题,或者说是优化还是劣化还不好说,简单的写了个demo;
你自己测一下试试性能吧!

var  json = [
  { dpt_AirPt_Cd: '成都', arrv_Airpt_Cd: '甘孜州', else: '123' },
  { dpt_AirPt_Cd: '成都', arrv_Airpt_Cd: '甘孜州', else: '1234' },
  { dpt_AirPt_Cd: '南充', arrv_Airpt_Cd: '甘孜州', else: '1235' },
  { dpt_AirPt_Cd: '成都', arrv_Airpt_Cd: '郫县', else: '1236' },
  { dpt_AirPt_Cd: '成都', arrv_Airpt_Cd: '甘孜州', else: '123' },
];

var hash={},result=[];
json.map(function(obj){
  hash[(obj.dpt_AirPt_Cd+'-'+obj.arrv_Airpt_Cd)]=obj;
});
for(var key in hash){
  result.push(hash[key]);
}
console.log(result);

方式上无非就是用你参与去重的变量做key,整个obj做键值造一个对象。
key相同的话就丢弃了。
然后遍历对象输出到数组里面拿出来。

+++++++++++++++++
写完了发现大家都是这个思路!
哈哈哈!

千条数据主流浏览器应该没压力的,主要是你的算法时间复杂度太高。

供参考

var dict = []
var data = json.filter(function(el) {
  var key = el.arrv_Airpt_Cd + el.dpt_AirPt_Cd
  var result = !dict[key]
  dict[key] = true
  return result
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏