我有一个对象,它包含一个对象数组。
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"}
一种基本方法是:
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
。