JavaScript Object Array:删除具有重复属性的对象

时间:2015-09-17 15:49:56

标签: javascript arrays

我有一个对象数组:

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

我想删除带有重复ID的对象,留下一个如下所示的数组:

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

我不关心剩下哪些对象,只要每个ID都是唯一的。也许在下划线中有任何东西会这样做吗?

编辑:这与下面列出的副本不同;我不是要尝试过滤重复的OBJECTS,而是包含相同ID的对象。我用Underscore完成了这个 - 我很快就会发布答案。

5 个答案:

答案 0 :(得分:2)

您可以在此处使用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

答案 1 :(得分: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将运行更快的算法。如果要根据转换计算唯一项,请传递iteratee函数。

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

答案 2 :(得分:1)

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" }
    ]

答案 3 :(得分:0)

您可以简单地过滤数组,但是您需要一个已经使用过的现有ID的索引...

    var ids = [];
    var ar = [
        { id: 1, name: "Bob" },
        { id: 1, name: "Donald" },
        { id: 2, name: "Daryl" }
    ];
    ar = ar.filter(function(o) {
        if (ids.indexOf(o.id) !== -1) return false;
        ids.push(o.id);
        return true;
    });
    console.log(ar);

以下是filter() ...

的一些文档

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

答案 4 :(得分:0)

可以使用es6 Map collection with 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);