测试对象数组中的值

时间:2012-03-13 16:56:26

标签: javascript jquery arrays

我正在使用一个归结为这样的过程来动态构建一个对象数组:

//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实用程序)。但这不会考虑对象的价值观。我看到它的方式,我有两个选择:

  1. 保留一个仅包含ID的单独简单数组。因此,我只需检查objects(或简单的JS等价物),而不仅仅依赖于inArray数组,而只需查看仅用于此目的的简单“objectIDs”数组。

  2. 迭代我现有的数据对象,并将"foobar_1"针与每个objects[i].id草堆进行比较

  3. 我觉得#1肯定更有效率,但我不禁想知道我是否错过了能为我做这项工作的功能。我错过了#3,4或5选项! CPU消耗有点重要,但我也对使代码更简洁的函数感兴趣,无论它们是否更具循环效率。

2 个答案:

答案 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++;
}