关于数组去重的问题,应该是老生常谈了,现在网上也有很多版本是关于数组去重的。我在这里就列举一下常见和我自己的一个数组去重的方法。
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