2011-12-20 29 views
0

我試圖輸出數組的鍵在JavaScript這樣的:的JavaScript,在聲明中

data=[8, 4, 6, 9, 5, 2, 4, 6]; 
for(i in data){console.log(i);} 

但是,相反的只是輸出的鑰匙,它輸出這樣的:

0 
1 
2 
3 
4 
5 
6 
7 
$family 
each 
clean 
associate 
link 
contains 
extend 
getLast 
getRandom 
include 
combine 
erase 
empty 
flatten 
hexToRgb 
rgbToHex 
min 
max 
average 
sum 
unique 
shuffle 

爲什麼?我怎樣才能讓它停止輸出數組鍵之後?

回答

2

使用「正常」 for循環,而不是:

for(var i = 0; i < data.length; i++) { 
    console.log(data[i]); 
} 

JavaScript的for...in構建迭代的所有屬性該對象,因此您可以獲得所有的屬性/方法(實際上,它將沿着原型鏈的所有方向)以及您期望的元素。

+0

請注意,我並不建議使用'forEach',因爲缺少瀏覽器支持。如果您需要支持所有主流瀏覽器,幾年之前甚至不會考慮可靠的本地'forEach'支持。 –

1

這是因爲數組是對象,並且for-in迭代屬性,而不是數組索引。你可以這樣做:data.forEach(function(a,i){console.log(i);})或者你可以檢查的屬性,看他們是否「在」 Array.prototype

1

A for..in循環遍歷對象的所有枚舉屬性。我不知道如何在陣列上定義所有這些額外的屬性 - 是否使用將它們添加到Array.prototype的庫?

您應該使用傳統的for循環來檢查數組的數字索引項 - 這會自動忽略任何其他屬性。如果你只是要輸出的指標則是這樣的:

for (var i=0; i < data.length; i++) { 
    if (typeof data[i] !== "undefined") 
     console.log(i); 
} 

注意.length返回一個比最高的定義指數走高,但這並不意味着所有的低索引實際上在他們,所以我的值爲」已經包括了一個檢查,每個項目不是未定義的。如果undefined是數組中的有效值,那麼可以刪除它 - 實際上我很少使用帶有「孔」的數組,但爲了完整性,我提到了它。

P.S.您可以使用.forEach(),但舊版瀏覽器不支持它。

+0

除非他使用'delete'刪除元素,否則所有元素都會有值 - 而且undefined也是有效的值。所以通常檢查未定義是沒有必要的 – ThiefMaster

+0

@ThiefMaster - 對於問題中的示例它不會是一個問題,但我試圖提供一個更通用的答案。如果你說'var x = []; x [20] = true;'所有小於索引20的元素都不會有值,而不使用'delete'。但是,這種方式的代碼很少,是的,未定義_may_是一個有效值,這就是爲什麼我注意到如果不需要可以刪除該測試。 – nnnnnn

+0

在這種情況下,它應該是一個對象而不是數組;) – ThiefMaster