数组去重
数组去重是前端笔试或面试中经常出现的一道题,伴随着 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)
}