文章类型:个人学习笔记
1.双循环遍历
let arr = [1, 5, 6, 1, 9, 9, 2, 1];
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--; // 这里是修正,递减j
}
}
}
return array;
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
下面一种方式更优,遍历的次数更少
2. ES6的Set
let arr = [1,5,6,1,9,9,2,1];
function unique(arr) {
return Array.from(new Set(arr))
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
function unique(arr) {
return [...new Set(arr)]
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
3.利用indexOf()
let arr = [1,5,6,1,9,9,2,1];
function unique(arr){
if(!Array.isArray(arr)){
console.log('type error');
return;
}
let array = [];
arr.map(item => {
if(array.indexOf(item) === -1){
array.push(item)
}
})
return array;
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
4.利用sort(),然后比较相邻元素是否相等
let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return;
}
arr = arr.sort()
let arrry = [arr[0]];
arr.map((item, index) => {
if (index > 0 && item !== arr[index - 1]) {
arrry.push(item)
}
});
return arrry;
}
console.log(unique(arr)); // [1, 2, 5, 6, 9]
5.利用filter()和map(),当找到的下标不等于当前下标时就证明这个元素在前面出现过,排除掉
filter()
let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return;
}
return arr.filter((item, index) => {
return arr.indexOf(item) === index;
})
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
map()
秒啊!
6.利用reduce()方法
let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return;
}
return arr.reduce((prev, cur, index) => prev.includes(cur) ? prev : [...prev, cur], []);
}
console.log(unique(arr)); // [1, 5, 6, 9, 2]
秀啊!
总结:ES6下,以上几种方法首选第二种 new Set(),其次选择filter()和reduce()