『前端面试100问』数组去重的方法

482 阅读3分钟

JavaScript数组去重是腾讯面试的一道经典题目,面试官考察的不是候选人能不能做出这道题,而是能有多少种方法解决,进而考察编程能力和JavaScript基础。

有两点需要注意:

1.复杂度问题
2.数组中的数据,比如NaN, null, undefined, {}这些特殊值的处理

方法1:indexOf

思路:创建一个新数组,遍历原数组中的元素,若元素不在新数组中,则添加,否则继续处理下一个;

复杂度分析:

    时间复杂度:O(n^2)
    空间复杂度:O(n)
var arr = [2,3,4,5,3,4,2,6,4]

function removeDup(arr) {
    arrNew = []
    for(let item of arr) {
        if (arrNew.indexOf(item) === -1) {
            arrNew.push(item)
        }
    }
    return arrNew
}
arr = removeDup(arr)
console.log(arr)

>> [2, 3, 4, 5, 6]

方法2:indexOf --ES5常用 --O(n^2)时间复杂度

var arr = [2,3,4,5,3,4,2,6,4]
function removeDup_1(arr) {
    for(let i = 1; i < arr.length; i++) {
        for(let j = i - 1; j >= 0; j--) {
            if (arr[i] == arr[j]) {
                arr.splice(i, 1) // 删除操作会改变数组长度
                i = i - 1 // 每次删除一个数字,都应该将指针前移
            }
        }
    }
}
removeDup_1(arr)
console.log(arr)

>> [2, 3, 4, 5, 6]

方法3:filter+indexOf

思路:利用ES6新增的数组方法 filter() 来实现,通过判断当前元素的 index 与该元素在数组中第一次出现的位置是否一致,如果一致,则说明该元素是第一次出现,否则就说明该元素之前出现过,已经重复了。

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

var arr = [2,3,4,5,3,4,2,6,4]
function removeDup_2(arr) {
    return arr.filter((item, index, arr) => {
        return arr.indexOf(item, 0) === index // 判断item第一次出现的位置与当前位置是否一致
    })
}
arr = removeDup_2(arr)
console.log(arr)

方法4:Set

思路:利用ES6新增的数据结构 Set 和 Map 来实现,Set 中的元素唯一,Map 则是通过 键值对的形式存储数据,可以在 O(1) 的时间内判断元素是否存在,从而提高查找速度
var arr = [2,3,4,5,3,4,2,6,4]
arr = [...new Set(arr)]
//或
arr = Array.from(new Set(arr))

方法5:Map

var arr = [2,3,4,5,3,4,2,6,4]
function removeDup_3(arr) {
    let map = new Map()
    let arrN = []

    for(let item of arr) {
        if (!map.has(item)) {
            map.set(item, true) // map没有该key值
            arrN.push(item)
        }
    }

    return arrN
}

arr = removeDup_3(arr)
console.log(arr)

方法6: 利用排序

思路:首先对数组进行排序,把第一个元素放入新数组,之后通过判断当前元素与前一个元素是否相同,来判断元素是否是重复的。
function removeDup(arr) {
    arr.sort() // sort()函数默认按照字符编码的顺序进行排序,会对元素进行字符串转换;如果想按其它标准排序,则需要提供比较函数

    let arrN = [arr[0]]

    for(let i = 1; i < arr.length; i++) {
        if (JSON.stringify(arr[i]) !== JSON.stringify(arr[i-1])) {
            arrN.push(arr[i])
        }
    }

    return arrN;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]
arr = removeDup(arr) 
console.log(arr)

[0, 1, 15, NaN, "NaN", Object {  }, "a", false, null, "true", true, undefined]

如果你觉得这篇文章写的还不错,欢迎给我点个 关注🌟🌟🌟

欢迎 点赞、评论、转发,你们的支持就是我写作的最大动力❤️❤️❤️