数组对象去重
数组对象就是数组里的每一项都是一个对象,例:
//需要去重的数组对象(每个对象都有唯一标识)
oldArr = [
{ id: 01, name: "John" },
{ id: 02, name: "Doe" },
{ id: 02, name: "Doe" },
{ id: 03, name: "Lisa" },
{ id: 04, name: "Jane" },
{ id: 03, name: "Lisa" },
{ id: 02, name: "Doe" },
{ id: 05, name: "Eve" },
];
//想要达到的结果
newArr = [
{ id: 01, name: "John" },
{ id: 02, name: "Doe" },
{ id: 03, name: "Lisa" },
{ id: 04, name: "Jane" },
{ id: 05, name: "Eve" },
];
几种数组对象去重的方法
1、对象访问属性的方法
总体思路:新建一个辅助对象unique,用原数组中的每个对象的唯一标识作为新对象unique的key,根据unique的key判断
function getObjectUnique(arr) {
let newArr = []; //去重后的数组
let unique = {};
arr.forEach((item) => {
if (!unique[item.id]) {
//当数组内对象的唯一标识id不在对象unique里面就将该对象添加到newArr中
newArr.push(item);
//将对象的唯一标识id作为unique对象的key,value为true
unique[item.id] = true;
}
});
return newArr;
}
2、Map方法
总体思路:set方法可以向Map对象添加新元素 map.set(key, value),然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。values方法可以返回Map对象值的遍历器对象。
function getObjectUnique(arr) {
let map = new Map();
for (let item of arr) {
map.set(item.id, item);
}
const newArr = [...map.values()];
return newArr;
}
3、双层循环
效率相对比较低,但是便于初学者理解
function getObjectUnique(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i].id == arr[j].id) {
//将重复的对象删除
arr.splice(j, 1);
j--;
}
}
}
return arr;
}