2011-06-28 58 views
1

所以我在這裏有一個Person對象,具有以下兩個屬性:名字和心情。假設firstname屬性是唯一的。如何在JavaScript中最好地搜索和更新兩個對象數組?

如果我有3個人對象的數組()(假定每行是一個人對象):

Alison, Happy 
Bob, Sad 
Charles, Happy 

如果具有例如3人(從JSON陣列)的第二陣列:

Alison, Sad 
Bob, Happy 
Jordan, Sad 

我想最有效的方式是能夠通過第二陣列來迭代更新第一陣列中的項目。我想到的方式是2 for循環。因此,例如:

第一次迭代,看到艾莉森,通過搜索爲艾莉森第一陣列,更新艾莉森就難過。第二次迭代,看到鮑勃,通過搜索...等 第三次迭代,看到喬丹,通過對喬丹第1個數組搜索,沒有找到......推新對象到與約旦,悲傷陣列。

現在我知道該陣列可能不會做到這一點的最好辦法,如果有更好的方式來做到這一點沒有1個數組是一個數組..可能是一個地圖,等我不在乎什麼是性能我所描述的方法是非常低效的許多人,例如,如果將陣列尺寸100

的請幫幫忙,將不勝感激。

回答

0

這一定程度上取決於你的瀏覽器和庫環境。有Array.indexOf('value'),但在IE中不起作用,它可能只是在幕後進行(優化)循環。

如果你有大量的數據,並且很可能進行排序,這似乎並不爲你的情況下,最好做一個二進制搜索。換句話說,從數據集的中間取值並將其與您的查詢進行比較。如果它更大,那麼你的下一個查詢就是這組值的前半部分的中間值,依此類推,直到你得到它。

不一定是性能問題的解決方案(儘管比一些更好),但減少編碼開銷方面的這種工作的一個好的選擇是underscore.js庫。使用下劃線,您可以使用_detect獲取您的值,如果未找到,則只需使用Array.push

0

如果每個人都有一個唯一的ID或參考,你可以把它們放在一個對象,並使用該ID作爲關鍵字,然後執行:

if (sadBob.id in personCollection) { 
    // sadBob is already there 
    personCollection.update(sadBob); 

} else { 
    // add sadBob 
    personCollection.addPerson(sadBob); 
} 

或者,您也可以將屬性添加到人對象在array2中創建它們時,它們是array1中的索引。所以如果他們沒有索引,他們不在array1中。如果他們有一個索引,你可以直接到那裏(這與上面的對象基本相同,並使用數組索引作爲引用或id)。

+0

什麼類型的人收藏? – Utiveras

+0

@Utriras - 一個對象。這可能有助於更多地瞭解如何創建* person *對象以及它們如何在person數組中生成。 – RobG

+0

函數Person(名字,心情){this.name = name,this.mood = mood} < - 這是如何創建對象的。 – Utiveras

相關問題