在JavaScript中删除对象数组中的重复对象

时间:2014-11-15 06:31:32

标签: javascript jquery arrays

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是要从数组中删除的副本。

5 个答案:

答案 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数组中删除重复对象的方法 -

&#13;
&#13;
lines.sortBy[String]( (line:String) => { val split = line.split("  "); split(0) + "  " + split(1) }, true, 1 )
&#13;
&#13;
&#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']);