JS数组去重
- 最简单的数组去重 由于Set中不会出现相同的值(空对象{}不能实现去重)
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
console.log([...new Set(arr)]);
function unique (arr) {
return Array.from(new Set(arr))
}
console.log(unique(arr))
- 创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值(空对象{}不能实现去重)
function unique2(arr) {
let map = new Map();
let array = new Array();
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) {
map.set(arr[i], "true");
} else {
map.set(arr[i], "true");
array.push(arr[i]);
}
}
return array;
}
var arr2 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique2(arr2))
- filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素(所有元素类型的都支持)
用 typeof item + item 的唯一性,放到obj里,有就返回false,没有就typeof item + item放到obj里面,返回true
var arr1 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
var obj = {};
return arr.filter((item, index, arr) => {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
console.log(unique(arr1));
- 利用在filter回调中元素的索引和在数组的索引值,否则返回当前元素(NaN全部都去掉了)
function unique(arr) {
return arr.filter(function(item, index, arr) {
return arr.indexOf(item, 0) === index;
});
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
- for for 然后splice去重,ES5常用NaN和{}没有去重,两个null直接消失了
- includes 判断是否存在那个元素,新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。 {}没有去重
- indexOf判断是否存在那个元素,新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。NaN和{}没有去重
- sort()排序+递归 遍历前一个是否相等,若相等则spliceNaN和{}没有去重
- sort()排序,遍历及相邻元素比对,若和前一个元素不相等,则这个元素push到新数组NaN和{}没有去重
参考该博客