單數(shù)組去重
- filter + indexOf()
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique (arr) {
return arr.filter((item, index, array) => array.indexOf(item) === index);
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- filter + Map()
Map() 對(duì)象的 has 方法是:如果映射包含指定元素,則返回 true,檢測(cè)的是key值
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
const seen = new Map();
return arr.filter((item) => !seen.has(item) && seen.set(item, 1));
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- forEach + indexOf() + 新數(shù)組
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
let newArr = [];
arr.forEach((item, index, array) => {
if(array.indexOf(item) === index) {
newArr.push(item);
}
});
return newArr;
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- Set() + Array.from
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
return Array.from(new Set(arr));
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- Set() + [...()]
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
return [...(new Set(arr))];
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- reduce + includes()
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
- for循環(huán)(一次) + sort()排序 + 新數(shù)組
自動(dòng)排好序
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique(arr){
arr.sort();
let newArr = [arr[0]];
for(let i = 1; i < arr.length; i++){
if(arr[i] !== newArr[newArr.length - 1]){
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(unique(arr)); // [0, 1, 2, 3, "a", "b", "d", "e"]
- 兩次for循環(huán)(不推薦)
let arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0, 2, 2, 3];
function unique (arr) {
let newArr = [arr[0]];
for(let i = 1; i < arr.length; i++){
let flag = false;
for(var j = 0; j < newArr.length; j++){
if(arr[i] == newArr[j]){
flag = true;
break;
}
}
if(!flag){
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(unique(arr)); // [1, "a", "b", "d", "e", 0, 2, 3]
兩個(gè)數(shù)組去重的問(wèn)題
(一個(gè)數(shù)組包含于另一個(gè)數(shù)組中)
a = [1,2,3,4,5,6,7,8]; b = [2,5,8];
需要在數(shù)組 a 中過(guò)濾掉 b 中出現(xiàn)的元素
該問(wèn)題在實(shí)際項(xiàng)目中經(jīng)常出現(xiàn)
解決方案有很多,可以是兩個(gè) for 循環(huán),或者一個(gè) for 和 一個(gè) filter,一個(gè) filter 和 一個(gè) every,接下來(lái)介紹這幾種方法:
let originArr = [1,2,3,4,5,6,7,8,9];
let filterArr = [2,4,6,7];
// 推薦,filter + every
let result = originArr.filter( item1 => {
return filterArr.every( item2 => item2 !== item1);
}); // 1 3 5 8 9
// for + filter
let result = originArr;
for (let val of filterArr) {
result = result.filter(item => item !== val);
} // 1 3 5 8 9
有關(guān)數(shù)組的操作方法見(jiàn):https://ainyi.com/#/12