我想循环遍历一个对象数组,检查对象变量的名称是否等于传递给函数的元素的id,如果是这样,则将另一个对象的innerHTML设置为名称属性匹配对象。 离。
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;
}
}}
if中的“item”似乎没有引用变量的名称。如果我用自定义var_dump函数检查它,它告诉我值是“11”而不是“Guy1”。我不明白为什么。
编辑:
固定的for循环:
for (var item in samplearray)
{
if (samplearray[item].varname == id.id){
document.getElementById("changeme").innerHTML=samplearray[item].name';
}}
答案 0 :(得分: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
你需要等待元素在与它们交互之前可用,等待load事件是这样做的一种方式。
> 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){
所以 item 将是对 samplearray 的Object成员的引用,而id.id
是一个字符串,所以这将始终返回false,以下代码都不是会跑。
> document.getElementById("changeme").innerHTML=item.name;
在 for..in 版本中, item 是一个字符串属性名称,但您将其视为一个对象,因此这将引发错误并且脚本执行将停止。
在for循环版本中,它是对 samplearray 中某个对象的引用,因此上面应该“正常工作”。
> document.getElementById("changeme").innerHTML=samplearray[item].name;
如果 item 是一个数字属性名而不是其他一些可枚举的属性,那么这应该有效。
> //neither does this
> } }}
*
Intialiser是创建对象(例如Object,Array,Regular Expression等)的表达式的通用术语。初始化者使用文字值时,可称为“文字”。
答案 1 :(得分: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
。