JS:仅从数组中提取唯一属性对象

我目前正在开发API,我需要在其中创建一个函数来提取“完全”唯一的对象,即任何对象中的属性都不匹配。

我有一个固定模式的对象数组,例如:

let arr = [
  {
    "a": "a1",
    "b": "b1",
    "c": "c1",
    "d": "d1",
    "e": "e1"
  },
  {
    "a": "a2",
    "b": "b2",
    "c": "c2",
    "d": "d2",
    "e": "e2"
  },
  {
    "a": "a3",
    "b": "b3",
    "c": "c2", // matching attribute
    "d": "d3",
    "e": "e3"
  },
  // … more objects here, maximum 200 * 33 objects
]

我希望结果为:

[
  {
    "a": "a1",
    "b": "b1",
    "c": "c1",
    "d": "d1",
    "e": "e1"
  },
  {
    "a": "a2",
    "b": "b2",
    "c": "c2",
    "d": "d2",
    "e": "e2"
  },
  // … 
]

如果属性匹配,则保留在数组中最先遇到的对象,并丢弃另一个对象。不同的属性永远不会有重叠的值。

我当前的实现:

for (let i in arr[0]) {
    let map = new Map();
    arr = arr.filter(obj => map.get(obj[i]) ? false : map.set(obj[i], true));
}
console.log(arr);

有没有更好(更有效)的方法来做到这一点?

评论
gsint
gsint

我将对到目前为止找到的所有值进行设置。检查新对象时,请检查集合中是否包含其任何值:如果是,则排除它,否则将所有值添加到集合中:

let arr = [
  {
    "a": "a1",
    "b": "b1",
    "c": "c1",
    "d": "d1",
    "e": "e1"
  },
  {
    "a": "a2",
    "b": "b2",
    "c": "c2",
    "d": "d2",
    "e": "e2"
  },
  {
    "a": "a3",
    "b": "b3",
    "c": "c2", // matching attribute
    "d": "d3",
    "e": "e3"
  },
  // … more objects here, maximum 200 * 33 objects
];
const valuesFound = new Set();
const uniques = arr.filter((obj) => {
  const vals = Object.values(obj);
  if (vals.some(val => valuesFound.has(val))) {
    return false;
  }
  for (const val of vals) {
    valuesFound.add(val);
  }
  return true;
});
console.log(uniques);
点赞
评论