1

我想遍历一个对象数组,检查对象变量的名称是否等于传递给函数的元素的 id,如果是,则将另一个对象的 innerHTML 设置为匹配对象的 name属性。前任。

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';
}}
4

2 回答 2

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); 

使用对象和数组初始化器被认为是更好的风格(并且更整洁)*:

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。

>   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等)的总称。在初始化程序使用文字值的地方,它可能被称为“文字”。

于 2013-10-09T00:21:45.403 回答
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循环是否正常工作。

于 2013-10-09T00:20:01.140 回答