双重循环
使用循环嵌套,如果值相等,就删去这个值。
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)。
- 缺点:可能有兼容性问题