JS面试题:数组去重 - 掘金 (juejin.cn)
1. 普通简单数组去重
方法1:利用indexof来去重
const arr = [1,2,3,4,5,6,6,5,4,3,2,1,0]
const newArr = arr.filter((it, index, list)=>list.indexOf(it) === index)
console.log(newArr)
// 输出:1 2 3 4 5 6 0
复制代码
indexof返回数组中第一个满足的值,这样过滤的话,就能达到去重的效果
方法2:new Set()去重
const arr = [1,2,3,4,5,6,6,5,4,3,2,1,0]
const newArr = [...new Set(arr)]
console.log(newArr)
// 输出:1 2 3 4 5 6 0
复制代码
2. 对象数组去重
方法1
const objArr = [{
name: '名称1'
},{
name: '名称2'
},{
name: '名称3'
},{
name: '名称1'
},{
name: '名称2'
}]
const obj = {}
const newObjArr = []
for(let i = 0; i < objArr.length; i++){
if(!obj[objArr[i].name]){
newObjArr.push(objArr[i]);
obj[objArr[i].name] = true
}
}
console.log(newObjArr)
复制代码
输出结果:
[
{
name: '名称1'
},{
name: '名称2'
},{
name: '名称3'
}
]
复制代码
解析: 先设置一个空对象和一个新的空数组,把要数组遍历,看这个对象中是否有之前存入的name值,如果有就不存入,如果没有就存入;
方法2:利用reduce
const objArr = [
{
name: '名称1'
},
{
name: '名称2'
},
{
name: '名称3'
},
{
name: '名称1'
},
{
name: '名称2'
}
]
const obj = {}
const newObjArr = objArr.reduce((prev, curr) => {
obj[curr.name] ? true : (obj[curr.name] = true && prev.push(curr))
return prev
}, [])
console.log(newObjArr)
复制代码
3. 两个数组之间去重
var arr3 = [{
id: 1,
name: 'lily'
}, {
id: 2,
name: 'hz'
}, {
id: 3,
name: '123'
}, {
id: 4,
name: '321'
}, {
id: 5,
name: 'aa'
}]
var other = [{
id: 1,
name: 'lily'
}, {
id: 2,
name: 'hz'
}]
isOther = (x, arr) => {
for (var i = 0; i < arr.length; i++) {
if (x === arr[i].id) {
return true;
}
}
return false;
}
console.log(arr3.filter((item) => !isOther(item.id, other)));
复制代码
输出:
[
{id: 3, name: '123'},
{id: 4, name: '321'},
{id: 5, name: 'aa'}
]