数组去重

2019-07-05  本文已影响0人  没了提心吊胆的稗子
var ary = [1,2,3,4,5,6,3,2,1,4,6,3,5,8,4,2,2,8,3,9,5,8,7];

数组去重

1、双重遍历 每一次用当前项跟后面所有项比较,有相等的记录,就是重复项。外层循环ary.length-1次,因为最后一项后面没有了,性能不好
需要解决数组塌陷问题,有两种办法

// 方案一 双重遍历
for (let i = 0; i < ary.length -1 ; i++) {
    var cur = ary[i];
    // 拿出这一项和后面的每一项比
    for(let j = i + 1; j < ary.length; j ++){
        if(cur === ary[j]){
            // 若相等,删除当前项 会出现数组塌陷 当前项后面的索引都要向前提一位
            ary.splice(j, 1);
            j --;
        }
    }
}
var ary = [1,2,3,4,5,6,3,2,1,4,6,3,5,8,4,2,2,8,3,9,5,8,7];
// 方案一 双重遍历
for (let i = 0; i < ary.length -1 ; i++) {
    var cur = ary[i];
    // 拿出这一项和后面的每一项比
   for(let j = i + 1; j < ary.length;){
       // 删除的时候不加,不删的时候再加
       cur === ary[j]  ? ary.splice(j,1) : j ++;
    }
}

2、indexOf实现 数组中有就删除当前项(不兼容IE6-8) 一次循环实现

for (let i = 0; i < ary.length; i++) {
    var cur = ary[i]; // 当前项  跟后面元素组成的新数组比较
    var curNextAry = ary.slice(i + 1);
    if(curNextAry.indexOf(cur) > -1){
        ary.splice(i, 1);
        i --;
    }
}

3、利用对象键值对操作 把当前项作为对象的属性名属性值即 obj[ary[i]] = ary[i],每次存储之前先验证,若已有说明重复,删除当前项

var obj = {};
for (let i = 0; i < ary.length; i++) {
    if(typeof obj[ary[i]] === 'undefined'){
        obj[ary[i]] = ary[i];
    }else{
        ary.splice(i,1);
        i --;
    }
}

以上方法都用splice方法删除,若后面有很多项,消耗会很大,优化删除方法
用最后一项替换需要删除的一项,最后一项删除

var obj = {};
for (let i = 0; i < ary.length; i++) {
    if(typeof obj[ary[i]] === 'undefined'){
        obj[ary[i]] = ary[i];
    }else{
        ary[i] = ary[ary.length - 1];
        ary.length --;
        i --;  // 当前循环过了还得再循环一次
    }
}

最终版

Array.prototype.myUnique = function () {
  var obj = {};
    for (let i = 0; i < this.length;) {
        if(typeof obj[this[i]] === 'undefined'){
            obj[this[i]] = this[i];
            i ++;
        }else {
            this[i] = this[this.length - 1];
            this.length --;
        }
    }
    return this;
};

set集合去重 set集合是不重复的一组元素的集合,利用这个特点去重

var newSet = new Set(ary);
console.log(Array.from(newSet));

相邻比较法
先排序,再跟相邻元素比较

var newAry = [1,2,3,5,2,3,6].sort(function (a,b) {
    return a - b;
});
for (let i = 0; i < newAry.length; i++) {
    if(newAry[i] === newAry[i+1]){
        newAry.splice(i+1, 1);
        i --;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读