数组去重

数组去重

数组去重是前端笔试或面试中经常出现的一道题,伴随着 ECMAScript(后文缩写为 ES) 的发展,它的解法也越来越简单,越来越优雅。
个人认为,由于 ES6 的出现,这道题今后也不需要出现在面试中了。
但是目前还是有为数不少的公司,仍然钟情于使用原始的解法,今天笔者罗列一下数组去重的三种方法。

ES5 之前的解法

最原始的方法,支持 ES 任意版本,典型的命令式,面向过程

function removeDuplicates(arr) {
    var newArr = arr.slice()

    for (var i = 0; i < newArr.length; i++) {
        for (var j = i + 1; j < newArr.length; j++) {
            if (newArr[i] === newArr[j]) {
                newArr.splice(j, 1)
                j--
            }
        }
    }

    return newArr
}

ES5 的解法

使用了 ES5 新增的数组方法,典型的函数式,声明式

function removeDuplicates(arr) {
    return arr.filter((oldItem, index) => {
        return !arr.slice(index + 1).some(newItem => newItem === oldItem)
    })
}

ES6 的解法

面向未来的数组去重方法,只有一行代码

function removeDuplicates(arr) {
    return [...new Set(arr)]
}

从上面可以明显看出这几种方法的区别,当然是 ES6 的方法更加简洁优雅

有些面试题还会加上对去重数组排序的需求,我们只需要定义一个 sort 函数即可

function sort(arr, isAscending = true) {
    if (isAscending) {
        return arr.sort((a, b) => a - b)
    } else {
        return arr.sort((a, b) => b - a)
    }
}

这里用到了 ES6 的默认参数值语法,默认是升序排列。最后再定义一个函数,把上面这两个函数包起来即可

function removeDuplicatesAndSort(arr, isAscending = true) {
    return sort(removeDuplicates(arr), isAscending)
}

注意上面的三种方法都没有改变原来的数组,这也是我们在定义函数的时候需要注意的地方,尽量不要改变原数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容