js 数组去重 单元素和对象数组

2019-05-05 03:29:09javascript, 数组排序js

源码

//方案1,旧方案
Array.prototype.unique = function(key) {
    var arr = this;
    var n = [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (key === undefined) {
            if (n.indexOf(arr[i]) == -1) n.push(arr[i]);
        } else {
            inner: {
                var has = false;
                for (var j = 0; j < n.length; j++) {
                    if (arr[i][key]!==undefined && arr[i][key] === n[j][key]) {
                        has = true;
                        break inner;
                    }
                }
            }
            if (!has) {
                n.push(arr[i]);
            }
        }
    }
    return n;
}

//方案2,相比方案一,少了一层循环,提高效率,逻辑更加清晰
Array.prototype.uniqueTree = function(key) {
        var res = [];
        var json = {};
        var arr = this;
        for (var i = 0; i < arr.length; i++) {
            if (arr[i][key]===undefined||json[arr[i][key]]===undefined) {
                res.push(arr[i]);
                json[arr[i][key]] = 1;
            }
        }
        return res;
    };
    

###使用方法:

[1,2,3,4,3,2].unique()
//[1,2,3,4]
[{a:1},{a:2},{a:1}].unique('a')
//[{a:1},{a:2}]

热门评论:

  • 西橘 西橘 2018-11-15 1:58 回复:

    在vue框架中我该怎么调用这个那

    • jsoncode jsoncode 2019-5-5 3:28 回复:西橘
      多层循环中,退出内层循环用

data:{
list:[{a:1},{a:2},{a:2}],
},
mounted:function(){
this.list = this.list.unique('a')
}



----
- ![HZ_quan](js_数组去重_单元素和对象数组_/3179314346-5f61e47221e07.png#avatarimg) [HZ_quan](https://segmentfault.com/u/hz_quan) 2019-5-5 2:00 回复:
  <p>inner 这个没理解</p>


----
- ![HZ_quan](js_数组去重_单元素和对象数组_/3179314346-5f61e47221e07.png#avatarimg) [HZ_quan](https://segmentfault.com/u/hz_quan) 2019-5-5 2:03 回复:
  <p>有bug   [{a:1},{a:1},{b:3},{c:4}].unique('a')   试试这个就知道了</p>

  - ![jsoncode](js_数组去重_单元素和对象数组_/3774603972-56e6a42c83ff8_big64.png#avatarimg) [jsoncode](https://segmentfault.com/u/jsoncode) 2019-5-5 3:25 回复:HZ_quan
    感谢提醒,已经修复了:  arr\[i\]\[key\]\!==undefined && arr\[i\]\[key\] === n\[j\]\[key\] ,这里判断条件不足