提问者:小点点

从JavaScript中的对象数组中删除重复项


我有一个对象,它包含一个对象数组。

things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

我想知道从数组中移除重复对象的最佳方法是什么。 例如,事情。事情会变成。。。

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

共3个答案

匿名用户

一种基本方法是:

var obj = {};

for ( var i=0, len=things.thing.length; i < len; i++ )
    obj[things.thing[i]['place']] = things.thing[i];

things.thing = new Array();
for ( var key in obj )
    things.thing.push(obj[key]);

匿名用户

用一些ES6魔法怎么样?

things.thing = things.thing.filter((thing, index, self) =>
  index === self.findIndex((t) => (
    t.place === thing.place && t.name === thing.name
  ))
)

引用URL

更通用的解决办法是:

const uniqueArray = things.thing.filter((thing, index) => {
  const _thing = JSON.stringify(thing);
  return index === things.thing.findIndex(obj => {
    return JSON.stringify(obj) === _thing;
  });
});

Stackblitz示例

匿名用户

如果您可以使用Javascript库(如下划线或lodash),我建议您查看它们库中的_.uniq函数。 来自lodash:

_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

基本上,您要传入数组(这里是一个object literal),并传入要移除原始数据数组中重复项的属性,如下所示:

var data = [{'name': 'Amir', 'surname': 'Rahnama'}, {'name': 'Amir', 'surname': 'Stevens'}];
var non_duplidated_data = _.uniq(data, 'name'); 

更新:Lodash现在也引入了一个.uniqby