2012-03-13 41 views
0

我使用可以归结为这样的一个过程动态构建对象的数组的数组中值:试验对象

//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。因此,我只是简单地检查inArray(或普通的JS等价物),而不是仅依赖于objects数组,因此仅为此目的使用了一个简单的“objectIDs”数组。

  2. 迭代通过我现有的数据对象和我"foobar_1"针比较各objects[i].id草垛

我觉得#1肯定是更有效的,但我不禁怀疑,如果我失去了一个功能,将为我做这项工作。我错过了#3,4或5选项! CPU消耗有点重要,但我也对那些使代码不那么冗长的函数感兴趣,无论它们是否更加有效。

+0

你为什么不做一个大哈希出来(而不是数组)? – 2012-03-13 16:59:37

+0

@SergioTulentsev诚实的事实是,我从来没有机会使用散列,所以我在理论,最佳实践或语法方面没有任何知识。我不介意打破我的舒适区,但我必须教自己。 ;-) – 2012-03-13 17:09:40

+0

查看@ jfriend00的答案。这就是我正在谈论的。 – 2012-03-13 17:10:31

回答

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已经在y我们的名单与否。它不会给你数组给你的唯一的东西是特定的对象顺序,因为对象的键没有任何特定的顺序。

+0

这对我很有意义;这是我原本想象的,但实际的一面(特别是'addObject'函数)让我难以忍受。我有时会发现很难将实际的代码和语法与我脑海中的想法相匹配。 – 2012-03-13 17:12:39

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++; 
} 
+0

谢谢,Moutasem。看起来像jfriend00的;在那里他是一个物体,时期,你似乎坚持原始的“一系列物体”的描述。除此之外,在功能上等同。 – 2012-03-13 17:21:33

+0

必须注意像'if(!objects [“new id”])''这样的语句。如果ID可能是0(或任何错误的值),那么这将无法正常工作。 – jfriend00 2012-03-13 17:46:38

+0

为什么你将对象声明为一个数组,然后像对象一样使用它? – jfriend00 2012-03-13 17:47:14