【问题标题】:Javascript array problem: Cannot read property of undefined [closed]Javascript数组问题:无法读取未定义的属性[关闭]
【发布时间】:2018-12-15 11:30:44
【问题描述】:

我正在尝试用 javascript 编写一些应用程序,但遇到了数组问题。

我有以下代码

var levels=new Array(),level={};
level.id=1;level.name="Суперваизер";level.url="supervisor";
levels.push(level);
level.id=2;level.name="Торговый представитель";level.url="agent";
levels.push(level);
level.id=3;level.name="Группа продукта";level.url="pg_group";
levels.push(level);
level.id=4;level.name="Категория продукта";level.url="pg_category";
levels.push(level);
level.id=5;level.name="Торговая марка";level.url="pg_trademark";
levels.push(level);
level.id=6;level.name="Продукт";level.url="product";
levels.push(level);
level.id=7;level.name="Регион";level.url="region";
levels.push(level);
level.id=8;level.name="Типы т.т.";level.url="outlet_type";
levels.push(level);
level.id=9;level.name="Торговая точка";level.url="outlet";
levels.push(level);
level.id=10;level.name="Тип оплата";level.url="payment_type";
levels.push(level);
level.id=11;level.name="Филиал";level.url="filial";
levels.push(level);
level.id=12;level.name="Экспедитор";level.url="expeditor";
levels.push(level);
level.id=13;level.name="Участник проекта";level.url="action_type";
levels.push(level);

//select
var select='<select>';
for(var i=0;i<13;i++){
  var option='<option value=' + levels[i].id + '>' + levels[i].name + '</option>';
  select+=option;
  }
select+='</select>';

此代码在浏览器中显示错误:

未捕获的类型错误:无法读取未定义的属性“id”

在这种情况下如何使用数组?

【问题讨论】:

  • 这段代码有个大问题:它总是设置同一个关卡对象。
  • 而不是创建一个对象字面量并不断地覆盖它(这会影响已经推入数组的所有其他实例)。每次推送一个新的空白对象文字。 array.push({ id:1, name:"first one" })
  • 问题在于您没有显示的代码。上面的代码不会触发您描述的错误。 (它有提到的大问题dystroy,但这不会导致上面的错误。)
  • 投票关闭为“无法复制”
  • 这不是问题,但这里有一个更好的方法来创建该数组(并且没有上面提到的问题 dystroy):pastie.org/9326267 或者当然你可以使用构造函数来避免重复输入属性名称。

标签: javascript html arrays


【解决方案1】:

正如@dystroy 所说,您每次都使用相同的level 对象并修改它而不是创建一个新对象。

无论如何,你可以用这个语法来简化它:

var levels = [
    {id: 1,  name: "Суперваизер",            url: "supervisor"  },
    {id: 2,  name: "Торговый представитель", url: "agent"       },
    {id: 3,  name: "Группа продукта",        url: "pg_group"    },
    {id: 4,  name: "Категория продукта",     url: "pg_category" },
    {id: 5,  name: "Торговая марка",         url: "pg_trademark"},
    {id: 6,  name: "Продукт",                url: "product"     },
    {id: 7,  name: "Регион",                 url: "region"      },
    {id: 8,  name: "Типы т.т.",              url: "outlet_type" },
    {id: 9,  name: "Торговая точка",         url: "outlet"      },
    {id: 10, name: "Тип оплата",             url: "payment_type"},
    {id: 11, name: "Филиал",                 url: "filial"      },
    {id: 12, name: "Экспедитор",             url: "expeditor"   },
    {id: 13, name: "Участник проекта",       url: "action_type" }
];

var select = '<select>';
for(var i = 0; i < levels.length; i++) {
    select += '<option value=' + levels[i].id + '>' + levels[i].name + '</option>';
}
select += '</select>';

【讨论】:

  • 虽然这是真的,但这显然不是 OP 的问题。 (不过,这是更好的代码。)他/她引用的代码没有复制 OP 声明的错误,目前无法回答该问题。
【解决方案2】:

您可以使用匿名对象并将它们推送到数组中

levels.push({ id: 1, name: "Суперваизер", url: "supervisor" });

我建议在for 循环中使用您的数组长度,而不是硬编码值:

for(var i = 0; i < levels.length; i++){
    //do work
}

Fiddle

【讨论】:

  • 虽然这是真的,但这不是 OP 的问题。事实上,OP 引用的代码(尽管它有一个大问题)并没有表现出 OP 所说的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2019-04-09
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多