2013-10-08 2 views
1

Я хочу перебрать массив объектов, проверить, совпадает ли имя переменной объекта с идентификатором элемента, переданного функции, и если это так, установите 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 (это) изображением. Поэтому 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) { 

Что такое идентификатор? Кажется, вы относитесь к нему как к объекту позже.

Ah, поэтому id - ссылка на элемент, а id.id должен возвращать идентификатор элемента.

> for (item in samplearray) { 

Вы должны объявить переменные, чтобы они не стали глобалам, так:

for (var item in samplearray) { 

Это вообще не очень хорошая идея использовать for..in с массивом, так как для того, чтобы члены возвращаются могут отличаются от их индексного порядка. Кроме того, он будет возвращать все перечислимые свойства, в том числе в цепочке прототипов, поэтому вам следует защититься от этого, если это не то, что вы хотите. Гораздо лучше использовать для цикла, так что вы можете гарантировать порядок и избежать нецифровых перечисляемых свойств:

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

>  if (item == id.id){ 

Так пункта будет ссылкой на член Объектному samplearray и id.id является строкой, так это всегда будет возвращать false, ни один из следующих кодов не будет запущен.

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

В for..in версии, пункт это имя свойства строки, но вы лечите его как объект, так это вызовет ошибку и выполнение скрипта прекратится.

В версии для петли, это ссылка на один из объектов в 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 loop. Итак, что не так с использованием цикла, как в том, что я сделал? – Cid2196

+0

Почему использование 'for ... in' в массиве может быть плохим: http: // stackoverflow.com/questions/500504/why-is-use-for-in-with-array-iteration-such-the-bad-idea –

Смежные вопросы