js对象数组去重

可以使用Set数据结构来实现对象数组去重。

例如,假设有以下对象数组:

const arr = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice' },
  { id: 3, name: 'Charlie' },
  { id: 2, name: 'Bob' }
];

可以使用Set和Array.from()方法来去重:

const uniqueArr = Array.from(new Set(arr.map(obj => JSON.stringify(obj)))).map(str => JSON.parse(str));
console.log(uniqueArr);
// Output: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]

这里先使用map()方法将对象数组中的每个对象转换为字符串,然后使用Set去重,最后再使用Array.from()方法将Set转换为数组。最后再使用map()方法将字符串转换为对象。需要注意的是,这种方法会将对象中的属性顺序打乱,因为JSON.stringify()方法会按照属性名的字母顺序进行序列化。如果需要保持属性顺序,可以使用其他方法进行去重。

另一种方法是使用reduce()方法和Object.keys()方法来实现对象数组去重。具体实现如下:

const arr = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice' },
  { id: 3, name: 'Charlie' },
  { id: 2, name: 'Bob' }
];

const uniqueArr = arr.reduce((acc, cur) => {
  const keys = Object.keys(cur);
  const objStr = keys.map(key => `${key}:${cur[key]}`).join('|');
  if (!acc[objStr]) {
    acc[objStr] = cur;
  }
  return acc;
}, {});

console.log(Object.values(uniqueArr));
// Output: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]

这里使用reduce()方法遍历对象数组,对于每个对象,将其属性名和属性值拼接成一个字符串,作为该对象的唯一标识符。然后将该标识符作为键,将该对象作为值存储在一个空对象中。如果该标识符已经存在于空对象中,则不进行存储。最后使用Object.values()方法将存储在空对象中的值转换为数组返回。这种方法可以保持对象属性的顺序,但是需要注意属性值中不能包含竖线(|)字符,否则会导致标识符生成错误。