数组去重
关于去重最先想到的思路就是双层循环,通过遍历比较。
1. splice
var arr = [1, 2, 1, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]; for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] == arr[j]) { //如果后面和前面相同,删除后面一个 arr.splice(j, 1); //因为删除过后,后面元素会移到前面一位,所以要减一。 //自己可以测验一下,比如有连续的三个1,一试便知。 j--; } } } console.log(arr); //[1, 2, undefined, NaN, NaN, 'NaN', {…}, {…}] //NaN和{}没有去重,两个null直接消失了
2. indexOf
var arr = [null, null, NaN, NaN, 'NaN', {}, {}]; var array = []; for (var i = 0; i < arr.length; i++) { if (array.indexOf(arr[i]) === -1) { //如果未找到项目,Array.indexOf() 返回 -1。 array.push(arr[i]) } } console.log(array)// [null, NaN, NaN, 'NaN', {…}, {…}]
3. sort
var arr = [null, null, NaN, NaN, 'NaN', {}, {}]; arr = arr.sort() var array = [arr[0]]; for (var i = 1; i < arr.length; i++) { if (arr[i] !== arr[i - 1]) { array.push(arr[i]); } } console.log(array)//[NaN, NaN, 'NaN', {…}, {…}, null] //NaN、{}没有去重
4. filter
var arr = [null, null, NaN, NaN, 'NaN', {}, {}]; var array = arr.filter(function (item, index, arr) { //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素 return arr.indexOf(item, 0) === index; }); console.log(array) //[null, 'NaN', {…}, {…}]
5. includes
var arr = [null, null, NaN, NaN, 'NaN', {}, {}]; var array = []; for (var i = 0; i < arr.length; i++) { if (!array.includes(arr[i])) { array.push(arr[i]); } } console.log(array)//[null, NaN, 'NaN', {…}, {…}]
6. es6中的方法 (如不考虑兼容性此方法代码量最少,但不能去除重复的控对象)
let arr = [12,43,23,12,43,55] let item = [... new Set(arr)]