我正在使用一个归结为这样的过程来动态构建一个对象数组:
//Objects Array
var objects = [];
//Object Structure
var object1 = {"id":"foobar_1", "metrics":90};
var object2 = {"id":"some other foobar", "metrics":50};
objects[0] = object1;
objects[1] = object2;
(让我们记录一下,如果你能想出一种动态嵌套数据的更好方法,以便我可以用objects[i].id
来访问它,我也是耳朵!)
最终会发挥比上面更多的逻辑,但它还没有写出来。我只想说“object1”和“object2”部分实际上是在迭代器中。
在迭代器中,我想在将另一个对象添加到数组之前检查是否存在ID。例如,如果我已经拥有ID为"foobar_1"
的对象,而不是将新成员推送到数组,我只想增加其"metrics"
值。
如果我没有处理一组对象,我可以使用inArray
来查找“foobar_1”(一个jQuery实用程序)。但这不会考虑对象的价值观。我看到它的方式,我有两个选择:
保留一个仅包含ID的单独简单数组。因此,我只需检查objects
(或简单的JS等价物),而不仅仅依赖于inArray
数组,而只需查看仅用于此目的的简单“objectIDs”数组。
迭代我现有的数据对象,并将"foobar_1"
针与每个objects[i].id
草堆进行比较
我觉得#1肯定更有效率,但我不禁想知道我是否错过了能为我做这项工作的功能。我错过了#3,4或5选项! CPU消耗有点重要,但我也对使代码更简洁的函数感兴趣,无论它们是否更具循环效率。
答案 0 :(得分:2)
我建议切换到对象而不是数组:
var objects = {};
objects["foobar_1"] = {metrics: 90};
objects["some other foobar"] = {metrics: 50};
然后,要唯一地添加新对象,您可以这样做:
function addObject(id, metricsNum) {
if (!(id in objects)) {
objects[id] = {metrics: metricsNum};
}
}
要迭代所有对象,您可以这样做:
for (var id in objects) {
// process objects[id]
}
这使您可以非常有效地查找给定ID是否已存在于列表中。它之前没有给出的唯一一件事就是特定的对象顺序,因为对象的键没有任何特定的顺序。
答案 1 :(得分:1)
//Objects Array
var objects = [];
//Object Structure
var object1 = {"metrics":90};
var object2 = {"metrics":50};
objects["foobar_1"] = object1;
objects["some other foobar"] = object2;
// An example to showing the object existence.
if (!objects["new id"]){
objects["new id"] = {"metrics": 100};
}
else {
objects["new id"].matrics++;
}