数组去重通用做法个别有两种办法:
1、两层循环
2、利用对象属性的不可重复性
还有一种是语言自身 api
个性,js
利用 indexOf
、includes
、Set
等办法
将上面合过属性进行去重操作
let arr = [1, 1, "true", "true", true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, "NaN", 0, 0, "a", "a", {}, {}, 1, "true", true, 15, false, 'false', undefined, null, NaN, "NaN", 0, {}];
用 Set 去重
无奈对对象去重
const newArr = Array.from(new Set(arr));
// 等价于
const newArr = [...new Set(arr)];
console.log(newArr)
for 循环嵌套 for 循环,用 splice 去重
第一个和第二个雷同,用 splice
删掉第二个
对象和 NaN
无奈去重
Tips:会扭转原数组
for
循环能够用 forEach
、map
等代替,逻辑都差不多
for (let i = 0; i < arr.length; i++) {for (let j = i + 1; j < arr.length; j++) {if (arr[i] === arr[j]) {arr.splice(j, 1);
}
}
}
console.log(arr);
indexOf 去重
新建一个数组,for
循环原数组,判断新数组中有没有以后元素,有就跳过,没有就放进去。
对象和 NaN
无奈去重
let newArr = [];
for (let i = 0; i < arr.length; i++) {if (newArr.indexOf(arr[i]) === -1) {newArr.push(arr[i]);
}
}
console.log(newArr);
includes 去重
应用办法和 indexOf
差不多,但它能够对 NaN
去重
对象无奈去重
let newArr = [];
for (let i = 0; i < arr.length; i++) {if (!newArr.includes(arr[i])) {newArr.push(arr[i]);
}
}
console.log(newArr);
利用 sort 排序
利用 sort
,for
循环 sort
排序后的数组,比拟以后数组和以后数组的前一项,如果相等就跳过
对象和 NaN
无奈去重
Tips:如果排序进去雷同的有距离,则距离的无奈去重,比方:[true, 'true', true]
arr = arr.sort();
let newArr = [];
for (let i = 0; i < arr.length; i++) {if (arr[i] !== arr[i - 1]) {newArr.push(arr[i]);
}
}
console.log(newArr)
利用 filter 配合 indexOf
和遍历差不多,应用 indexOf
的话 NaN
全副被去掉了(不包含 'NaN'
),因为用 indexOf
找不到 NaN
。
对象不会被去重
const newArr = arr.filter((item, index, array) => array.indexOf(item) === index
);
console.log(newArr);
利用 reduce 配合 includes
const newArr = arr.reduce((prev, cur) => (prev.includes(cur) ? [...prev] : [...prev, cur]),
[]);
console.log(newArr);
利用 filter 和 hasOwnProperty
定义一个空对象
用 filter
遍历数组,应用 hasOwnProperty
判断 obj
上有没有这个属性,如果有,就返回 false
如果没有返回 true
,并将这个值以属性的形式保留在 obj
Tips:对象无奈去重,最初只会保留一个对象
var obj = {};
let newArr = arr.filter(function (item, index, arr) {return obj.hasOwnProperty(typeof item + item)
? false
: (obj[typeof item + item] = true);
});
console.log(newArr);
以上数组去重的形式,都有一点有缺点,要写出完满的去重形式须要思考多种数据类型,这里不做过多探讨,下面几种形式的去重可根本满足日常工作的须要。