2012-03-13 42 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