当前位置: 首页 > 知识库问答 >
问题:

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

蓝侯林
2023-03-14

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

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答案非常受欢迎。

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

  • 从JavaScript数组中删除重复项
  • 在JavaScript数组中查找重复值的最简单方法

编辑这是我尝试的。它适用于字符串,但我不知道如何使它适用于对象:

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

共有3个答案

姬浩渺
2023-03-14

这很好用。

const result = [1, 2, 2, 3, 3, 3, 3].reduce((x, y) => x.includes(y) ? x : [...x, y], []);

console.log(result);
严安志
2023-03-14

在对象中存储循环外部的name的出现次数,并过滤是否存在先前的出现次数。

https://jsfiddle.net/nputptbb/2/

var occurrences = {}

var filteredFamily = family.filter(function(x) {
  if (occurrences[x.name]) {
    return false;
  }
  occurrences[x.name] = true;
  return true;
})

您也可以将此解决方案推广到函数

function filterByProperty(array, propertyName) {
  var occurrences = {}

  return array.filter(function(x) {
    var property = x[propertyName]
    if (occurrences[property]) {
      return false;
    }
    occurrences[property]] = true;
    return true;
  })
}

并像这样使用它

var filteredFamily = filterByProperty(family, 'name')

不要使用indexOf比较对象,indexOf只在对象之间使用操作符。您当前的答案不起作用的原因是,JS中没有深入比较对象,而是比较引用。我的意思是,您可以在以下代码中看到:

var a = { x: 1 }
var b = { x: 1 }

console.log(a === b) // false
console.log(a === a) // true

等式将告诉您是否找到了相同的精确对象,但不会告诉您是否找到了具有相同内容的对象。

在这种情况下,您可以在名称上比较对象,因为它应该是唯一的键。Soobj。名称===对象。名称,而不是obj===obj。此外,代码的另一个影响其运行时而非功能的问题是,在您的reduce中使用了索引ofindexOf是O(n),这使得算法的复杂性增加。因此,最好使用具有O(1)查找的对象。

夔博
2023-03-14

您可以将集与数组#映射和扩展运算符结合使用 在单行中。

Map返回一个包含所有名称的数组,这些名称将进入集合初始化程序,然后集合的所有值都在一个数组中返回。

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);
 类似资料:
  • 我试图确定一个关键字名称是否存在于我的对象数组中。例如,我如何验证名称为name的键是否等于在函数调用中传递的参数?下面是进一步澄清的代码。

  • 我有一个数组: 我想将具有相同“ID”的对象组合成数组中的相同对象。它们的共同密钥也应该组合在一起(例如:'名字'、'电子邮件')。有人能建议做这件事的最好方法吗?使用ES6或Lodash

  • 所以这个问题以前被问过,但我的情况有点不同,因为我已经尝试了这个网站中建议的所有解决方案,我有一个多提及数组: 我还有另一个小数组: 我只想找到与这个“dup”在同一行的“original”。到目前为止,我尝试了查找、过滤和grep,但这些都没有解决我的问题。 我尝试过的代码:

  • 我有一个包含两个对象的对象数组。每个对象都有几个属性;一个是< code>dealerNo。给定< code>dealerNo的值,我如何获得该对象的索引?

  • 我在团结中挣扎。我想创建一个脚本,能够找到离玩家最近的对象(我设法做到了),以及离玩家第二近的对象。我的问题是如何修改此代码,使其也适用于第二个对象?

  • 问题内容: 我知道以前也曾问过类似的问题,但是这个问题有些不同。我有一个未命名对象的数组,其中包含一个已命名对象的数组,我需要获取“名称”为“字符串1”的对象。这是一个示例数组。 更新: 我应该早先说过,但是一旦找到它,我想用一个编辑过的对象替换它。 问题答案: 您可以遍历数组并测试该属性: