美文网首页
数组去重

数组去重

作者: 没了提心吊胆的稗子 | 来源:发表于2019-07-05 17:22 被阅读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 --;
    }
}

相关文章

  • Array集结号

    实现数组去重的几种方法 数组去重一 数组去重二 利用数组indexof+push实现数组去重 数组去重三 利用对象...

  • 实现数组去重有哪些方式

    简单的数组去重 数组对象去重

  • 数组去重的四种方法

    利用双for循环去重 利用对象数组去重 利用对象数组去重并且记录重复次数 通过创建一个新数组进行数组去重

  • js数组去重、对象数组去重

    普通数组去重 一、普通数组去重 方法一:遍历数组法 方法二:排序法 方法三:对象法 对象数组去重 方法一:将对象数...

  • javascript数组去重,数组对象去重

    利用Reduce去重 function unique(arr) {var obj = {};arr = arr.r...

  • js:数组去重

    数组去重的常见写法: 数组去重封装成方法: es6的数组去重(Array.from):

  • ES6数组去重

    普通数组去重 方法1 方法2 对象数组去重

  • js reduce去重用法

    reduce不仅仅可以数据累加,还可以实现去重效果。 重复次数计算 数组去重 数组对象去重,转为数组 对象去重

  • 数组去重

    传统方法 ES6 扩展 传统方法 最后再写到 Array.prototype 原型中

  • 数组去重

    老题了。。虽然网上一搜一大堆,还是自己想了想,自己动笔写了几种。

网友评论

      本文标题:数组去重

      本文链接:https://www.haomeiwen.com/subject/rrpehctx.html