arr: [
{ id: 1, name: 'a' },
{ id: 1, name: 'f' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
{ id: 3, name: 'g' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' },
],
方法一:双重for循环
deweight() {
for (let i = 0; i < this.arr.length - 1; i++) {
for (let j = i + 1; j < this.arr.length; j++) {
if (this.arr[i].id == this.arr[j].id) {
this.arr.splice(j, 1)
//注意这里要j--,splice删除了一个元素,下标要减一,否则循环会漏掉一个元素
j--
}
}
}
console.log(this.arr)
},
//方法二:reduce()
deweight() {
var obj = {}
this.arr = this.arr.reduce(function (data, item) {
console.log(obj[item.id])
obj[item.id] ? '' : obj[item.id] = true && data.push(item)
return data;
}, [])
console.log(this.arr)
},
方法三:Map()
has方法可以判断Map对象中是否存在指定元素,有则返回true,否则返回false
set方法可以向Map对象添加新元素 map.set(key, value)
values方法可以返回Map对象值的遍历器对象
deweight() {
let map = new Map()
for (let i of this.arr) {
if (!map.has(i.id)) {
map.set(i.id, i)
}
}
this.arr = [...map.values()]
console.log(this.arr)
},
方法四 for 循环
类似方法二,obj中没有则添加 this.arr[i].id 这个key,并把值设为true,后续相同则不添加
deweight() {
let newArr = [];
let obj = {};
for (var i = 0; i < this.arr.length; i++) {
if (!obj[this.arr[i].id]) {
newArr.push(this.arr[i]);
obj[this.arr[i].id] = true;
}
}
console.log(newArr);
},
方法5:every()
every() 方法用于检测数组所有元素是否都符合指定条件
所有元素都满足条件,则返回 true,有一个元素不满足,则返回 false ,且剩余的元素不会再进行检测
deweight() {
let newArr=[]
this.arr.forEach(function(a){
let istrue=newArr.every(function(b){
return a.id != b.id
})
istrue ? newArr.push(a) : ''
})
console.log(newArr)
}
这几种方法都是用 对象的某个key做为唯一标识,相同则删除