2015-10-19 56 views
0

此刻我正在使用對象來模擬關聯數組。 對象就像一個一對多的關係表從MySQL 例如:JavaScript「關聯」對象與陣列

var obj = { 
    105: [], 
    200: [] 
    //... 
} 

我的屬性名稱是唯一的數字,所以我發現我可以用一個數組,太。 但是,索引之間的空條目填充undefined

var arr = []; 
arr[10] = "Value"; 
arr[15] = "Value 2"; 
//arr => [undefined*10, "Value", undefined*4, "Value 2"] 

因此,當我要迭代該數組時,我必須檢查當前索引值是否已設置。

所以問題是,哪個解決方案更快或更好。 使用一個對象或數組,其中 指針之間的空白區域填充了undefined值。

+0

http://stackoverflow.com/a/8067678/3166303 – leeor

+0

在你的案例對象應該使用更少的內存。迭代兩個結構大部分是相同的,但是您必須記住,JavaScript中的對象屬性沒有順序。 – VisioN

+0

[查看此鏈接的問題](http://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript) –

回答

2

如果您需要鍵值關聯,則需要一個對象。
如果你想要一個有序列表其中的密鑰並不重要,它是一個數組。僅供參考,數組中的指標「之間」集合索引實際上並未用undefined填充;當您嘗試任何物體上訪問一個不存在的屬性,你只是得到undefined值:

({}).foo; // undefined 
0

你問這是「更快,更好」。對於「更好」,存在許多可能的答案,但「更快」具有更清晰的答案:正如其他人指出的那樣,ObjectArray之間幾乎沒有速度差。兩者在原型層次結構中都有相同的根。 Array的空值不是「填充的」。

關於您的使用案例,瓶頸不會是對象,而是您如何循環它!這實際上是確實有所作爲:for循環比任何其他循環方式都快。但是你有非連續數字指數的問題。

因此:剛纔基準,如果你做

  • for(key in object)
  • keys = Object.keys()for(var i = 0; i < keys.length; i++)

因爲這兩個應該是最快的選擇需要多長時間。