Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object}
Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object}
Connector: {name: "ALAND", key: "", description: "Departure country (country from which the goods are sent)"}
同一个数组中有两个对象。连接器对象是相同的。如何删除重复元素并使用一个对象获取最终数组?
var array = [object 1, object 2];
object 2
是要从数组中删除的副本。
答案 0 :(得分:13)
如果您正在寻找完全匹配,这将会这样做:
function remove_duplicates(objectsArray) {
var usedObjects = {};
for (var i=objectsArray.length - 1;i>=0;i--) {
var so = JSON.stringify(objectsArray[i]);
if (usedObjects[so]) {
objectsArray.splice(i, 1);
} else {
usedObjects[so] = true;
}
}
return objectsArray;
}
var objectsArray = [{a:'foo',b:'bar'}, {a:'foo',b:'bar'}];
var clean = remove_duplicates(objectsArray);
答案 1 :(得分:3)
使用JSON.stringify的挑战是,如果对象可能包含循环引用,那么它将抛出异常,例如。
var x1 = {};
x1.a = x1;
JSON.stringify(x1); // <- Uncaught TypeError: Converting circular structure to JSON
然而,如上所述,如果您要比较对象而不是值,那么您就不能进行相等比较,因为对于不同的对象,它总是为假(即使它们具有相同的属性)值)。
如果您只是比较值,那么下面的内容就可以了
var x = [1,2,2,3,4,2,6]; // Source list
var x2 = []; // Will hold the de-duped result
x.forEach(function(elem){if(x2.indexOf(elem) === -1) x2.push(elem);});
x2; // <- [1, 2, 3, 4, 6]
如果你想将对象属性比较到一个级别,你可以写下面的东西(可能有一个更简单的方法 - 只是将它们一起搅打)
function sameValues(o1, o2){
for(p in o1){
if(o1[p] !== o2[p]) return false;
}
for(p in o2){
if(o2[p] !== o1[p]) return false;
}
return true;
}
var Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object};
var Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object};
var Object3 = {connectorIndex: 1, nodeID: 7, Connectors: Object};
var Object4 = {connectorIndex: 2, nodeID: 7, Connectors: Object};
var Object5 = {connectorIndex: 1, nodeID: 7, Connectors: Object};
var arr = [Object1, Object2, Object3, Object4, Object5];
var result = [];
arr.forEach(function(e1){
if(!result.some(function(e2){return sameValues(e1,e2);})){
// No existing object with same top level values in target array, so add
result.push(e1);
}
});
// result will have the 1st, 3rd, and 4th object only
答案 2 :(得分:1)
这就是我喜欢从javascript数组中删除重复对象的方法 -
lines.sortBy[String]( (line:String) => { val split = line.split(" "); split(0) + " " + split(1) }, true, 1 )
&#13;
这对我来说非常适合。
答案 3 :(得分:0)
使用数组来保存已有的项目并使用filter()
var keys = []
yourArray.filter(function(v) {
if (keys.indexOf(v.whatIAmLookingFor) < 0) {
keys.push(v.whatIAmLookingFor)
return true
}
return false
})
将其包裹在一个函数中并将其称为一天。通过测试功能,称之为更好的一天。
答案 4 :(得分:0)
不确定这是多么高效,但我有点喜欢它的简洁,适合我(它的ES6,但我相信你可以找出普通的OL&#39; ES5):
let dedupe = (arr, keys) => {
let deduped = [];
arr.forEach(i => {
if (deduped.length === 0) {
deduped.push(i);
} else {
let exists = deduped.find(x => {
return keys.every(key => {
return i[key] === x[key];
});
});
if (!exists) {
deduped.push(i);
}
}
});
return deduped;
};
objArr = dedupe(objArr, ['key', 'test', 'foo']);