美文网首页
前端面试必问之数组去重

前端面试必问之数组去重

作者: 明明你也一样 | 来源:发表于2019-12-02 10:34 被阅读0次

    基于数组API实现去重

    • 创建一个空数组空间来比较
      循环数组中的每一项添加到空数组中,每次添加的时候验证一下,新数组中是否包含这一项,有则不添加
    let arr = [1,3,2,2,3,1,1,1,2]
    let newArr = []
    for(let i = 0; i< arr.length; i++){
        let item = arr[i]
        // 验证数组项是否存在,也可以用indexOf、lastIndexOf方法
        if(newArr.includes(item)){
            continue
        }
        newArr.push(item)
    }
    

    还可以将代码简化成下面这样

    let arr = [1,3,2,2,3,1,1,1,2]
    let newArr = []
    arr.forEach(item => {
        if(newArr.includes(item)) return
        newArr.push(item)
    })
    
    • 创建一个对象空间来进行比较

    循环数组中的每一项,将索引和值当作对象的属性和值存储起来,每次存储之前检查对象属性是否存在,若存在则删除这一项

    let arr = [1,3,2,2,3,1,1,1,2]
    let obj = {}
    for(let i = 0; i< arr.length; i++){
        let item = arr[i]
        // 验证对象属性是否存在
        if(obj[item])){
            arr.splice(i,1)
            i--  // 解决数组塌陷问题
        }else{
            obj[item] = arr[i]
        }
    }
    

    但是从中间删除数组的一项是非常耗费性能的一件事,优化方法是将要删除的项与最后一项替换,删除最后一项来达成之前的效果。

    for(let i = 0; i< arr.length; i++){
        let item = arr[i]
        if(obj[item])){
            // 将当前项与最后一项替换
            arr[i] = arr[arr.length - 1]
            arr.pop(length-1)
            i--  // 解决数组塌陷问题
        }else{
            obj[item] = arr[i]
        }
    }
    

    双重循环去重

    循环数组,将这一项与数组之后的每一项进行比较,若相同则删除

    function removeDuplicates(arr) {
        for (let i = 0; i < arr.length; i++) {
            const item = arr[i]
            for (let j = i + 1; j < arr.length; j++) {
                if (item === arr[j]) {
                    arr.splice(j, 1)
                    j--
                }
            }
        }
        return arr
    }
    

    基于ES6的Set实现去重

    Set与解构赋值去重

    ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化

    arr = [...new Set(arr)]
    

    Set与Array.from去重

    Array.from方法可以将Set结构转换为数组结果

    arr = Array.from(new Set(arr))
    

    相关文章

      网友评论

          本文标题:前端面试必问之数组去重

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