2009-02-03 96 views
3

如果我有一個偶爾填充的Javascript數組,我該如何確定數組中非非元素的數量?如何確定數組中定義的元素的數量?

例如:

var zipCodes = []; 
zipCodes[10006] = 'New York, NY'; 
zipCodes[90210] = 'Los Angeles, CA'; 

zipCodes.length這裏返回90211,我真的不想遍歷90209個空話,找出我有兩個有效元素。使用for-in循環意味着處理任何可能導致原型鏈冒泡的事情,並試圖找出它是否爲陣列的一部分。

有什麼辦法,鑑於上面定義的數組,我可以提取「2」作爲定義元素的數量?

回答

12

您需要與鍵值對的對象(有點像一個關聯數組/哈希表),而不是一個數組:

var zipCodes = {}; 
zipCodes[10006] = 'New York, NY'; 
zipCodes[90210] = 'Los Angeles, CA'; 


for(var zipCode in zipCodes) { 
    if(zipCodes.hasOwnProperty(zipCode)) {//makes sure prototypes aren't taken into account 

    } 
} 

編輯: 或者你可以在這樣一個數組存儲對象:

var zipCodes = []; 
zipCodes.push({10006:'New York, NY'}); 
zipCodes.push({90210: 'Los Angeles, CA'}); 

//zipCodes.length = 2

+0

我相信你有你的對象/數組括號在你的變量聲明中顛倒過來。 – 2009-02-03 17:24:52

0

你也可以(取決於大量的各種電流的未知數)填充保持索引的第二陣列(索引?)的第一個數組中的填充條目。

所以,你可以有一個放大整個陣列上一次的方法,填充第二陣列:

var indexesNext = 0; 
var indexes = new Array(); 
for(i = 0 ; i < zipCodes.length ; i++) 
    if(zipCodes[i] != null) indexes[indexesNext++] = i; 

或者你可以使用郵編陣列上添加和刪除存取方法來更新索引數組,如果你期待它經常改變。

或者你可以在數組上使用Javascript sort()方法,並遍歷它直到你點擊一個空單元格。你也可以用它來優化以前的技術(YMMV在這種內置方法的效率上,但是我相信FFX 3.1和Chrome中的新Javascript引擎肯定會做的很好)。