在对象列表中查找重复键的最有效方法

时间:2013-08-06 03:45:26

标签: javascript sorting

我有一个我正在迭代的对象列表。在某些时候,我进行ajax调用以向列表中添加更多对象(可能多次)。

如果其中一个值与现有值匹配,是否有一种有效的方法可以排除任何对象添加到列表中?

例如:

现有列表

[
  {"value": "1", "id": "123"},
  {"value": "2", "id": "124"},
  {"value": "3", "id": "125"}
]

排除第一个对象的添加,因为它的ID已经在列表中

[
  {"value": "1", "id": "123"},
  {"value": "2", "id": "234"},
  {"value": "3", "id": "235"}
]

2 个答案:

答案 0 :(得分:5)

由于您的id是唯一的,为什么不使用map

之类的内容
  • 您可以创建并保存单独的var map = {};
  • 然后,每次有新对象进入时,请执行以下操作:map['123'] = true;

更像是:

if (!map[new_id])
{
    map[new_id] = true;
    your_array.push({"value": "3", "id": "235"});
}
else
{
    // do what you want... maybe update the value
}

因此,通过这种方式,您不会使用现有id推送任何对象。

答案 1 :(得分:1)

对象的_array_hash引用相同的对象,因此内存开销仅限于数组和散列中的引用,但不限于对象的完整副本。

小提琴:http://jsfiddle.net/vbjWK/

function UniqueArray(array, key) {
    this._array = [];    
    this._hash = {};
    this._key = key;

    this.concat(array);
}

UniqueArray.prototype.concat = function(array) {
    var i, len;

    for (i = 0, len = array.length; i < len; i++) {
        this.push(array[i]);
    }
}

UniqueArray.prototype.push = function(obj) {
    if (!this._hash[obj[this._key]]) {
        this._hash[obj[this._key]] = obj;
        this._array.push(obj);
    }
}

测试:

// Testing testing
var first = [
  {"value": "1", "id": "123"},
  {"value": "2", "id": "124"},
  {"value": "3", "id": "125"}
];

var second = [
  {"value": "1", "id": "123"},
  {"value": "2", "id": "234"},
  {"value": "3", "id": "235"}
]

var ua = new UniqueArray(first, "id");
ua.concat(second);

console.log(ua._array);