1.使用Array.filter()
和Array.findIndex()
方法
const arr = [
{id: 1, name: 'John'},
{id: 2, name: 'Mary'},
{id: 1, name: 'John'},
{id: 3, name: 'Peter'}
];
const uniqueArr = arr.filter((obj, index, self) => {
return index === self.findIndex(t => (
t.id === obj.id && t.name === obj.name
));
});
console.log(uniqueArr); // [{id: 1, name: 'John'}, {id: 2, name: 'Mary'}, {id: 3, name: 'Peter'}]
2.使用Map
对象
const arr = [
{id: 1, name: 'John'},
{id: 2, name: 'Mary'},
{id: 1, name: 'John'},
{id: 3, name: 'Peter'}
];
const map = new Map();
arr.forEach(obj => {
const key = obj.id + '|' + obj.name;
if (!map.has(key)) {
map.set(key, obj);
}
});
const uniqueArr = Array.from(map.values());
console.log(uniqueArr); // [{id: 1, name: 'John'}, {id: 2, name: 'Mary'}, {id: 3, name: 'Peter'}]
3.如果你确定每个属性都是基本类型(比如字符串、数字、布尔值等)并且没有任何内部对象或函数,那么可以省略比较阶段。此时可以使用JSON.stringify()
方法将每个对象转换为字符串,然后使用Set
对象去重。
const arr = [
{id: 1, name: 'John'},
{id: 2, name: 'Mary'},
{id: 1, name: 'John'},
{id: 3, name: 'Peter'}
];
const uniqueArr = Array.from(new Set(arr.map(obj => JSON.stringify(obj)))).map(str => JSON.parse(str));
console.log(uniqueArr); // [{id: 1, name: 'John'}, {id: 2, name: 'Mary'}, {id: 3, name: 'Peter'}]
4.