双重循环
使用循环嵌套,如果值相等,就删去这个值。
let array = [1,5,2,3,4,2,3,1,3,4]function unique(array) {for (let i = 0; i < array.length; i++) {for (let j = i + 1; j < array.length; j++) {if (array[i] === array[j]) {array.splice(j, 1)j--}}}return array}console.log(unique(array))
- 优点:兼容性好。
- 缺点:对象不可以去重,因为对象不可以用来比较;NaN不可以去重;时间复杂度o(n2)。
indexOf
新建一个新数组res,遍历传入数组,值不在新数组就push进该新数组中
let array = [1,5,2,3,4,2,3,1,3,4]function unique(array) {let res = [];for (let i = 0; i < array.length; i++) {var current = array[i];if (res.indexOf(current) === -1) {res.push(current)}}return res;}console.log(unique(array));
- 优点:可以区分’1’和1。
- 缺点:对象不可以去重,因为对象不可以用来比较;NaN不可以去重;时间复杂度o(n2)。
Set
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
因为Set中的元素是唯一的所以,可以用于数组去重。
let array = [1,5,2,3,4,2,3,1,3,4]function unique(arr){return Array.from(new Set(arr))}console.log(unique(array))
- 优点:简单高效时间复杂度到O(n),可用于NaN去重。
- 缺点:对象不可被去重;可能有兼容性问题。
Map
使用map的方法set和has,用has方法来判断是否存在这个key,如果没有值将map中存一个key-value。
let array = [1,5,2,3,4,2,3,1,3,4]function unique(arr) {let current = new Map()let res = arr.filter(function(item, index, arr) {if (current.has(item)) {return false} else {return current.set(item, 1)}})return res}console.log(unique(array))
- 优点:简单高效,时间复杂度到O(n)。
- 缺点:可能有兼容性问题
