如何在 JavaScript 对象数组中查找重复值,并仅输出唯一值?

如何在 JavaScript 对象数组中查找重复值,并仅输出唯一值?

问题描述:

我正在学习 JS.假设我有以下对象数组:

I'm learning JS. Supposing I have the below array of objects:

var family = [
  {
    name: "Mike",
    age: 10
  },
  {
    name: "Matt"
    age: 13
  },
  {
    name: "Nancy",
    age: 15
  },
  {
    name: "Adam",
    age: 22
  },
  {
    name: "Jenny",
    age: 85
  },
  {
    name: "Nancy",
    age: 2
  },
  {
    name: "Carl",
    age: 40
  }
];

请注意,Nancy 出现了两次(仅更改年龄).假设我只想输出唯一的名称.如何输出上面的对象数组,没有重复?ES6 回答非常受欢迎.

Notice that Nancy is showing up twice (changing only the age). Supposing I want to output only unique names. How do I output the above array of objects, without duplicates? ES6 answers more than welcome.

相关(找不到在对象上使用的好方法):

Related (couldn't find a good way for usage on objects):

编辑 这是我尝试过的.它适用于字符串,但我无法弄清楚如何使其适用于对象:

EDIT Here's what I tried. It works well with strings but I can't figure how to make it work with objects:

family.reduce((a, b) => {
  if (a.indexOf(b) < 0 ) {
    a.push(b);
  }
  return a;
},[]);

您可以使用 Set 结合 Array#map 和一个 展开运算符 ... 在一行中.

You could use a Set in combination with Array#map and a spread operator ... in a single line.

Map 返回一个包含所有名称的数组,这些名称将进入集合初始值设定项,然后集合中的所有值都返回到一个数组中.

Map returns an array with all names, which are going into the set initializer and then all values of the set are returned in an array.

var family = [{ name: "Mike", age: 10 }, { name: "Matt", age: 13 }, { name: "Nancy", age: 15 }, { name: "Adam", age: 22 }, { name: "Jenny", age: 85 }, { name: "Nancy", age: 2 }, { name: "Carl", age: 40 }],
    unique = [...new Set(family.map(a => a.name))];

console.log(unique);

对于过滤和仅返回唯一名称,您可以使用 Array#filter设置.

For filtering and return only unique names, you can use Array#filter with Set.

var family = [{ name: "Mike", age: 10 }, { name: "Matt", age: 13 }, { name: "Nancy", age: 15 }, { name: "Adam", age: 22 }, { name: "Jenny", age: 85 }, { name: "Nancy", age: 2 }, { name: "Carl", age: 40 }],
    unique = family.filter((set => f => !set.has(f.name) && set.add(f.name))(new Set));

console.log(unique);