JS实现数组去重
1.ES6新增数据去重方法Set
思路:Set 是ES6引入的一种新的数据结构类型,允许你存储任何类型的唯一值,无论是原始值还是对象引用
let aa = [1, 2, "2", 4, 9, "a", "a", 2, 3, 5, 6, 5]; //Set数组简单的去重 console.log([...new Set(aa)]); // [1, 2, "2", 4, 9, "a", 3, 5, 6] let s1 = new Set(); s1.add('a'); s1.add('a'); console.log(s1); //{"a"}
2.简单去重方法
思路:遍历数组中的每一个数据,判断新数组中是否存在当前数据,如不存在加入
//简单去重方法
function uniq(arr) {
let newArr = [];
arr.forEach(a => {
if (!isSame(newArr, a)) {
newArr.push(a);
}
})
return newArr;
}
function isSame(arr, value) {
for (let i = 0; i < arr.length; i++) {
const a = arr[i];
if (a === value) {
return true;
} else if ((isNaN(a) && a !== undefined && !a) && isNaN(value) && value !== undefined && !value) {//判断是否是NaN
return true;
}
}
return false;
}
uniq(aa); //[1, 2, "2", 4, 9, "a", 3, 5, 6]
3.数组下标判断方法
思路:判断当前数组的第i项第一次出现的位置是否是i位,若是,则不重复加入新数组
function uniq3(array) { let newarr = []; for (let i = 0; i < array.length; i++) { if (array.indexOf(array[i]) == i) { newarr.push(array[i]); } } return newarr; } console.log(uniq3(aa)); //[1, 2, "2", 4, 9, "a", 3, 5, 6]
4.相邻排序法
思路:给数组排序,仅加入不与相邻的数组相同的数据
function uniq4(array) { array.sort(); console.log(array); let temp = [array[0]]; for (let i = 1; i < array.length; i++) { if (array[i] != temp[temp.length - 1]) { temp.push(array[i]); } } return temp; } console.log(uniq4(aa)); //[1, 2, 3, 4, 5, 6, 9, "a"]
5.双层循环
思路:当内层循环检测到跟外层循环一样的值的时候,跳出内层循环,抛弃外层循环当前值,继续下一次循环
function uniq5(array) { let temp = []; for (let i = 0; i < array.length; i++) { for (let j = i + 1; j < array.length; j++) { if (array[i] === array[j]) { ++i; } } temp.push(array[i]); } return temp; } console.log(uniq5(aa)); //[1, "2", 2, 3, 4, 5, 6, 9, "a"]
6.Object.keys()
思路:Object.keys()
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in
循环遍历该对象时返回的顺序一致
let obj = {};//key arr1.forEach(item => { obj[item] = 1; }); console.log(Object.keys(obj).map(o => Number(o)));//[1, 2, 3, 4, 5]