Javascript数组查重和数组去重的N种办法(包含优缺点分析)

5,113 阅读2分钟

网上去重的办法很多,查重的办法不多,先实现一个利用indexOf实现查重的办法。


checkRepeat (data, type) {
    let arr = data
    let rep = [];
    arr.forEach((item,index)=>{
        console.log(arr.indexOf(item),index)
      if(arr.indexOf(item)!==index){ // 匹配数组元素item第一次出现的index和当前循环的index,如果不同,说明有重复
            let obj = {};
            obj.key = (arr.indexOf(item) + 1) + '|' + (index + 1); // 用'|'分隔两个重复项的下标   
            obj.value = item;
            rep.push(obj);
      }
    });
    return rep
}

接下来用几种办法实现数组去重

一、利用ES6 Set去重

let a =let a = [0, 0 , 1, 1,4,{}, "true", true, 13, NaN, "NaN", "NaN",false, undefined, null, NaN, null, undefined,"NaN", 0, "a", {}, 1, 1, 2,3,3,4]
let b = [...new Set(a)]
console.log(b)

二、利用indexOf去重

此办法思路和文章一开始的查重思路类似,这种办法对NaN无法去重 这里有两种实现方法,第二种是发现重复项,用数组的最后一项覆盖当前项,并把最后一项删除

function uniqueArr(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var array = [];
    for (let i = 0; i < arr.length; i++) {
        if (array.indexOf(arr[i]) === -1) {
            array.push(arr[i])
        }
    }
    return array;
}

let a = [0, 0 , 1, 1,4,{}, "true", true, 13, NaN, "NaN", "NaN",false, undefined, null, NaN, null, undefined,"NaN", 0, "a", {}, 1, 1, 2,3,3,4]
let b = uniqueArr(a)
console.log(b)
function uniqueArr(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    for (let i = 0; i < arr.length-1; i++) {
        // 拿出当前项与后面进行比较,利用slice方法把当前项的后面拿出来作为型数组
        let args = arr.slice(i+1),
            item = arr[i]
        if (args.indexOf(item) > -1) {
            // 发现重复项,把数组最后一项赋值当前项,所以会改变新数组里面内容的位置
            arr[i] = arr[arr.length - 1]
            // 最后一项不要了 数组长度减去1,当前循环索引减去1
            arr.length--
            i--
        }
    }
    return arr;
}

let a = [0, 0 , 1, 1,4,{}, "true", true, 13, NaN, "NaN", "NaN",false, undefined, null, NaN, null, undefined,"NaN", 0, "a", {}, 1, 1, 2,3,3,4]
let b = uniqueArr(a)
console.log(b)

三、for嵌套循环,splice实现。这种办法的缺点是NaN无法去重

function uniqueArr(arr){            
    for(let i=0; i<arr.length; i++){
        for(let j=i+1; j<arr.length; j++){
            if(arr[i]===arr[j]){         //第一个和后面一个重复,splice方法删除后一个
                arr.splice(j,1);
                j--;
            }
        }
    }
return arr;
}

let a = [0, 0 , 1, 1,4,{}, "true", true, 13, NaN, "NaN", "NaN",false, undefined, null, NaN, null, undefined,"NaN", 0, "a", {}, 1, 1, 2,3,3,4]
let b = uniqueArr(a)
console.log(b)

四、数组排序后,比较相邻2项,将重复的去除,缺点是只能针对数字去重,如果加入其它(比如字符串,布尔类型,对象类型,那么会把相同的数字隔开,起不到相邻去重的效果)。

这里有两种办法,一种是排序后相邻项比较大小,一种是排序后相邻项正则匹配。

function uniqueArr(arr) {
    arr.sort((a, b) => a - b)
    for (let i = 1; i<arr.length;i++) {
        if (arr[i-1] === arr[i]) {
            arr.splice(i-1,1)
            i--
        }
    }
	return arr
}

// let a = [0, 2 , 5, 1,4,{}, "true", true, 13, NaN, "NaN", "NaN",false, null, null, undefined, null, NaN, null, undefined,"NaN", 0, "a", {}, 1, 1, 2,3,3,4]
let a = [15, 24, 2, 11, 7, 93, 21, 24, 24, 15, 15, 7, 92, 15, 2, 15, 21]
let b = uniqueArr(a)
console.log(b)

function uniqueArr(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    let str = arr.sort((a, b) => a - b).join('@') + '@';
    let reg = /(\d+@)\1*/g,
        ary = []
    console.log(str)
    str.replace(reg, (val, group1) => {
        ary.push(Number(group1.slice(0,group1.length-1)))
    });
    return ary

}
let a = [12, 23, 12, 15, 25, 23, 25, 14, 16, 12, 12];
let b = uniqueArr(a)
console.log(b)

五、利用对象键值对去重,利用对象键值对,当键值已经存在时,说明当前项之前出现过了,重复了,用数组最后一项覆盖当前项。优点是可以把NaN去重,缺点是undefined无法去重。

function uniqueArr(arr) {
    let obj = {}
    for (let i = 0; i < arr.length; i++) {
        let item = arr[i]
        // 利用对象键值对,当键值已经存在时,说明当前项之前出现过了,重复了,用数组最后一项覆盖当前项
        if (obj[item] !== undefined) {
            arr[i] = arr[arr.length-1]
            i--
            arr.length--
            continue
        }
        obj[item] = item
    }
	return arr
}

let a = [0, 2 , 5, 1,4, "true", true, 13, NaN, "NaN", "NaN",false, null, null, undefined, null, NaN, null, undefined,"NaN", 0, "a", 1, 1, 2,3,3,4]
let b = uniqueArr(a)
console.log(b)