2013-10-08 76 views
1

我想遍歷一個對象數組,檢查對象變量的名稱是否等於傳遞給該函數的元素的id,如果是這樣,則設置另一個元素的innerHTML對象名稱屬性的匹配對象。 ex。在javascript的循環中使用對象名稱的數組

var samplearray = new Array(); 
var Guy1 = new Object(); 
Guy1.name = "Bill"; 
Guy1.health = 100; 
samplearray.push(Guy1); 
Guy2.name = "Dan"; 
Guy2.health = 125; 
samplearray.push(Guy2); 
//this is all done previously by a function on pageload 

function afunction(id){ 
for (item in samplearray) 
{ 
    if (item == id.id){ 
    document.getElementById("changeme").innerHTML=samplearray[item].name; 
    } 
}} 

「項目」中的如果似乎並不指變量的名稱。如果我用自定義的var_dump函數檢查它,它告訴我值是「11」而不是「Guy1」。我不知道爲什麼。

編輯:

固定的循環:

for (var item in samplearray) 
{ 
    if (samplearray[item].varname == id.id){ 
    document.getElementById("changeme").innerHTML=samplearray[item].name'; 
}} 
+0

什麼是* id *?你如何調用函數? * item *不應該是* window *,除非你用* samplearray *做了一些不顯示的事情。 – RobG

+0

在什麼情況下,下面的比較是正確的:item == id.id? – Prusprus

+0

這是一個由onclick(this)通過圖像調用的函數。所以id.id應該引用圖像的id,我想檢查它是否等於循環中對象的變量名稱。 – Cid2196

回答

2

我不太明白你在做什麼,但這裏是你的代碼的一些意見:

> var samplearray = new Array(); 
> var Guy1 = new Object(); 
> Guy1.name = "Bill"; 
> Guy1.health = 100; 
> samplearray.push(Guy1); 
> Guy2.name = "Dan"; 
> Guy2.health = 125; 
> samplearray.push(Guy2); 

它被認爲是更好的風格(有點整潔)使用對象和數組initialisers *:

var guy1 = {name: "Bill", health: 100}; 
var guy2 = {name: "Dan", health: 125}; 
var samplearray = [guy1, guy2] 

另外,按照慣例,以大寫字母開頭的變量名是爲構造函數保留的。

> //this is all done previously by a function on pageload 

在與它們交互之前需要等待元素可用,等待加載事件是這樣做的一種方式。

> function afunction(id) { 

什麼是ID?您似乎稍後將它當作對象來對待。

嗯,所以ID是一個元素的引用,而id.id應該返回元素ID。

> for (item in samplearray) { 

你應該聲明變量,使他們不會成爲全局變量,所以:

for (var item in samplearray) { 

它通常不會與一個數組,因爲成員返回的順序使用的for..in一個好主意,可與他們的索引順序不同。此外,它將返回所有可枚舉的屬性,包括原型鏈上的所有屬性,所以如果它不是您想要的,應該防範。更好的使用for循環,這樣就可以保證順序,避免非數字枚舉的屬性:

var item; 
    for (var i=0, iLen=samplearray.length; i<iLen; i++) { 
    item = samplearray[i]; 

>  if (item == id.id){ 

所以項目將是的samplearrayid.id對象成員的引用是一個字符串,所以這將始終返回false,以下代碼都不會運行。

>  document.getElementById("changeme").innerHTML=item.name; 

的for..in版本,項目是一個字符串屬性名稱,但你像一個對象處理它,這將拋出一個錯誤和腳本執行將停止。

在for循環版本中,它是對samplearray中的一個對象的引用,所以上面應該「工作」。

>  document.getElementById("changeme").innerHTML=samplearray[item].name; 

這應該有工作提供項目是一個數字屬性名稱,而不是其他一些枚舉屬性。

>  //neither does this 
>  } }} 

* Intialiser爲創建一個對象(例如,對象,數組正則表達式等)的表達的通用術語。在初始化程序使用文字值的地方,它可能被稱爲「文字」。

+0

謝謝,你實際上是在編寫這個問題時我還在編輯這個問題(其中一個評論幫助我弄清楚了,並且我發現我的代碼中有一部分錯誤,我沒有發佈這導致我在編輯時輸入的錯誤)​​。儘管如此,所有關於我的代碼的評論都是我不知道的。 id是通過圖像的onclick(this)方法傳遞的。另外,由於數組在我的代碼的另一部分構造的方式,我沒有使用初始化程序。 – Cid2196

+0

@MichaelGeary - 術語「初始化」實際上由ECMAScript規範使用,並且更容易閱讀像MDN這樣的指南,並且適用於「對象文字」和「數組文字」。另一方面,術語「對象字面量」通常不用於數組 - 但是您的編輯將其應用於普通對象和數組。 – nnnnnn

1
var Guy1 = new Object(); 

在這份聲明中,Guy1對象有沒有參考字符串"Guy1"。該對象存在沒有變量。的確,下一個陳述可以說:

var friend = Guy1; 

和對象Guy1對象將不會改變。

除此之外,我認爲你對for...in循環的工作方式感到困惑。嘗試閱讀更多在這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

如果你真的想你Guy1對象有"Guy1"的屬性,你需要將其指定爲這樣:

Guy1.varname = 'Guy1'; 

然後你就可以檢查if (item.varname == id.id)一旦你for...in循環正常工作。

+0

謝謝,我實際上從nnnnnn的評論上面得到了它的工作,沒有機會更新。這正是我所做的,並且我修復了for ... in循環。那麼像我編輯的編輯一樣使用循環有什麼問題? – Cid2196

+0

爲什麼在數組中使用'for ... in'可能很糟糕:http:// stackoverflow。com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea –