我有一个我正在迭代的对象列表。在某些时候,我进行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"}
]
答案 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);