關於數組去重的問題,應該是老生常談了,現在網上也有很多版本是關於數組去重的。我在這裏就列舉一下常見和我自己的一個數組去重的方法。
1.利用indexOf去重
let arr = [1, 2, 4, 5, 2, 5, 7, 7];
function unique(arr){
let res = arr.filter(function (item, index, array) {
return array.indexOf(item) === index;
})
return res;
}
這裏利用了indexOf首次出現會返回該元素下標的特性,如果2元素第一次出現時候的下標等於不等於它的下標,則說明重複了。
2.利用對象形式去重
function unique(arr) {
let res = []
let obj = {}
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
res.push(arr[i])
obj[arr[i]] = 1
} else {
obj[arr[i]]++
}
}
return res
}
這種方式也可以達到數組去重的目的,而且也可以算出這個元素出現的次數。
以上這兩種都是比較常見的形式,但這種形式會有個問題,如果我的數組改成數組對象的形式呢?
例如,
let arr = [
{name:"a"},
{name:"b"},
{name:"a"}
]
那我們就手動在函數unique中修改邏輯了,這其實不太符合我想要的預期效果,那麼我在這裏就封裝了一unique函數,這個函數可以接受兩個參數,第一個是數組,第二個是你希望比較的函數。
unique(arr,compare);
// 數組去重
unique(arr, compare) {
if (!Array.isArray(arr)) {
return []
}
compare = compare || this.isEqual;
return arr.filter((item, index) => {
const len = arr.length;
while (++index < len) {
if (compare(item, arr[index])) return false;
}
return true
})
},
// 默認相等的函數
isEqual(a, b) {
return a === b;
}
那麼在我們使用的時候就可以這樣使用,假設現在有這樣的數組
let arr = [1, 2, 4, 5, 2, 5, 7, 7];
console.log(unique(arr));
let arr = [
{ name: "a" },
{ name: "b" },
{ name: "c" },
{ name: "a" }
]
function compare(a,b){
return a.name === b.name
}
console.log(unique(arr));
代碼我也同步到了github上,地址爲
https://github.com/whenTheMorningDark/workinteresting/blob/master/src/utils/utils.js