JavaScript对象数组:删除具有重复属性的对象

5

我有一个对象数组:

[
  { id: 1, name: "Bob" },
  { id: 1, name: "Donald" },
  { id: 2, name: "Daryl" }
]

我希望去除具有重复编号的对象,留下一个看起来像这样的数组:

[
  { id: 1, name: "Bob" },
  { id: 2, name: "Daryl" }
]

只要每个ID都是唯一的,我不在乎留下哪些对象。有没有什么Underscore的东西可以做到这一点?

编辑:这与下面列出的重复内容不同;我不是试图过滤重复的对象,而是包含相同ID的对象。我使用了Underscore来完成这个任务-我很快就会发布答案。


1
可能是JavaScript中从对象数组中删除重复项的问题的重复。 - Marcos Pérez Gude
6个回答

9

您可以在这里运用 reducesome

var out = arr.reduce(function (p, c) {

  // if the next object's id is not found in the output array
  // push the object into the output array
  if (!p.some(function (el) { return el.id === c.id; })) p.push(c);
  return p;
}, []);

DEMO


4

ES6的方式

function removeDuplicates(myArr, prop) {
    return myArr.filter((obj, pos, arr) => {
        return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos
    })
}

测试它

let a =[
      { id: 1, name: "Bob" },
      { id: 1, name: "Donald" },
      { id: 2, name: "Daryl" }
    ]

    console.log( removeDuplicates( a, 'id' ) )

    //output [
      { id: 1, name: "Bob" },
      { id: 2, name: "Daryl" }
    ]

1
可以使用ES6中的Map集合与reduce函数混合使用。
const items = [
    { id: 1, name: "Bob" },
    { id: 1, name: "Donald" },
    { id: 2, name: "Daryl" }
]

const uniqItems = [...items.reduce((itemsMap, item) =>                                                                   
      itemsMap.has(item.id) ? itemsMap : itemsMap.set(item.id, item)
    , new Map()).values()]

console.log(uniqItems);

1
使用findIndex应该是最简单的解决方案。
array.filter((elem, index, arr) => arr.findIndex(e => e.id === elem.id) === index) 

1

如果您使用underscore,您可以使用_uniq方法。

var data = [
    { id: 1, name: "Bob" },
    { id: 1, name: "Donald" },
    { id: 2, name: "Daryl" }
]

_.uniq(data, function(d){ return d.ID });

使用 === 来测试对象的相等性,生成一个无重复的数组版本。特别地,只保留每个值的第一次出现。如果你预先知道这个数组是排序过的,则传递 isSorted 的值为 true 将运行更快的算法。如果您想基于转换计算唯一项,请传递一个迭代器函数。

来源: http://underscorejs.org/#uniq


2
var things = _.uniq(data, function(d){ return d.ID }); 看起来可以实现。但对于字符串就不太行了。 - opticon
谢谢,我刚找到文档。我会进行编辑。 - Richard Hamilton

0

@Michal 或许你能解释一下你的意思。我真的很想知道为什么这是“不好的做法”。 - Reinstate Monica Cellio
你的例子基于命令式编程。函数式编程可能有点难以理解,但绝对是正确的选择。 - Michal
@Michal,我不确定为什么你认为“函数式编程”更难理解,但无论如何,这并不重要。你实际上无法解释为什么称之为不良实践,因为它实际上没有任何问题。如果你只是想表达对另一种方法的偏好,那很正常,但请仔细考虑你的措辞。这个答案并不是不良实践-百分之百的事实。 - Reinstate Monica Cellio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接