在数组的javascript循环中使用对象名称

时间:2013-10-08 23:42:36

标签: javascript html

我想循环遍历一个对象数组,检查对象变量的名称是否等于传递给函数的元素的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';
}}

2 个答案:

答案 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