2011-04-14 87 views
1

根據我所知,Javascript中的數組只是方法和對象的組合。現在Javascript數組在IE 8問題

我的任務就是顯示數組的值(比方說y_array

我已經使用for(x in y_array),然後顯示的值。

在Mozilla中,在IE中它的工作正常,但在IE中,它顯示索引爲indexOf的數組的第一個元素,值爲indexOf(obj, from),我不想要。

我試圖

if(x!='indexOf') { display the array value ; } 

它的工作和事情都正常,但已顯示廣泛使用數組,我尋找一些永久性的修復,而不是硬編碼的這一個。

任何人都可以幫我嗎?

回答

10

你是不是第一次混合數組和對象。 SO應該包含這樣的問題,常見問題解答;)

讓我們試着去解釋的東西:

陣列是值的列,可以使用他們的行中的位置進行檢索。數組值的順序是固定的(並且可以重新排序)。

An object是一個包含鍵值對形式的命名屬性的變量。屬於一個對象的鍵值對的順序是任意的。

陣列看起來像:[ 'first', 'second', 'third', ..., 'nth' ]
一個目的看起來像:{ first:'firstvalue', second:'secondvalue', ..., nth:'nthvalue' }

陣列的第一個元素是索引爲0的元件(因此該行中的第一位置具有索引值0)。您使用myArray[0]

對象是無序的,所以它沒有第一個元素。您使用myObject.somekeymyObject['somekey']從中檢索任何元素。

對於您使用的是循環遍歷編號的指標,直到數組結束遍歷數組達到:

var i=0, len = myArray.length; 
for (i; i<len; i++) { 
    //do something with >>> myArray[i] <<< 
} 

對於對象使用一個循環利用的關鍵和in操作(確保你只檢索對象的用戶定義的屬性與.hasOwnAttribute法):

for (var key in myObject){ 
    if (myObject.hasOwnProperty(key)) { 
    // do something with >>> myObject[key] <<< 
    } 
} 

基本上,認爲陣列的與抽屜一個櫃子,每個包含一個值。一個物體可以想象成一堆盒子上帶有貼紙的盒子,描述盒子的內容。從一個物體中檢索某物,你問:在x中是否有一個貼紙y的盒子,如果有的話,那裏有什麼?從數組中檢索一些東西,你問:請給我抽屜的內容或者x

現在,作爲你的問題:您是一個for..in循環檢索值的數組包含一個用戶定義的方法,即indexOf。使用它的對象樣式循環,數組被視爲對象,並顯示indexOf鍵(值爲function(){...}我敢打賭)。 IE這就是爲什麼在迭代數組時使用帶有數字索引的傳統for循環可能更好。

這是爲什麼只能在IE?在現代瀏覽器中,indexOfArray原型的本地方法,並且不顯示本地方法(除非循環遍歷它們的原型)。 IE < 9沒有用於數組的本機indexOf方法。您在使用該方法的腳本中的某處已添加到Array原型作爲用戶定義的擴展。

您的問題底線:不通過數組的值,用for ... in循環。

+0

僅供參考,我不得不使用'myObject.hasOwnProperty(key)'。不知道爲什麼,但如果你遇到上述問題可能會有所幫助 – cowls 2014-04-17 08:26:54

+1

@cowls:很好的發現。這是一個混淆/錯字,我糾正了答案。 – KooiInc 2014-04-17 09:04:36

6

對於數組,你應該用這個循環:

var y_array = [1,2,3,4]; 
for (var i = 0; i < y_array.length; i++) { 
    var value = y_array[i]; 
    // do what you want 
    alert(i + ': ' + value); 
} 

對於對象(物體就像關聯數組 - 屬性:值)使用此循環:

var y_array = { prop_1 : "value a", prop_2: "value_2", prop_3: 333 } 
for (var key in y_array) { 
    var value = y_array[key]; 
    // do what you want 
    alert(key + ': ' + value); 
} 
+0

你讓我錯了帕維爾,這不是我的問題是什麼。我得到的方法indexOf作爲數組的第一個鍵,我想跳過,我試着匹配鍵如果(x!='indexOf'),但那硬編碼,我需要一些永久的解決方案,因爲有很多這樣的數組 – 2011-04-14 07:06:33

+0

你想跳過所有的函數或indexOf嗎? – 2011-04-14 07:14:34

+0

我想跳過indexOf,它是默認的數組的第一個元素。是否有任何功能或方法,做那件事或一些好的解決方案 – 2011-04-14 07:18:36

0

如果在你的JSON對象一樣jsobObj沒有價值= {}。然後你在IE < 9的空對象旁邊得到了indexOf原型函數。(函數(){...}我打賭)的值也被顯示出來。

你可以邊檢查條件的for循環。並跳過該indexOf。

如果(鍵== '的indexOf'){繼續;}

E.g:

var jsonObj = { key_1 : "value a", key_2: "value_2", key_3: 333 } 
for (var key in y_array) { 
if(key == 'indexOf'){continue;}   // check if the array contain indexOf 
    var value = y_array[key]; 
    // do what you want 
    alert(key + ': ' + value); 
}