【问题标题】:Javascript: Looping an object with TypeError property undefinedJavascript:使用未定义的 TypeError 属性循环对象
【发布时间】:2017-06-10 05:13:08
【问题描述】:

我有一个名为 xs 的对象数组,其中存储名称

xs = [
    {name: "Peter"},
    {name: "Doe"},
    {name: "Parker"},
    {name: "John"}
];

我有一个函数 setEmptyStr,如果变量未定义,则返回空字符串

function setEmptyStr(v) {
  if(typeof v !== 'undefined'){
    return v;
  } else {
    return '';
  }
}

我尝试循环我的对象数组(长度比它自己的数组长),我的数组长度是 4,我尝试 5。我不想使用 array.length;

for (var i = 0; i < 5; i++) {
    console.log(setEmptyStr(xs[i].name));
}

这 4 个名称返回成功,因为它不是未定义的。但是第五个是返回

TypeError 属性“名称”未定义。

>>Peter
>>Doe
>>Parker
>>John

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

我希望第 5 个返回一个空字符串。我怎样才能做到这一点?我的代码有错误吗?

>>Peter
>>Doe
>>Parker
>>John
>>""

【问题讨论】:

  • 不,您的代码中没有错误,实际上arr[5] 将是undefined,这就是您收到此错误的原因。
  • xs[i] 是未定义的东西,而不是 xs[i].name
  • 我试过了,它返回 Uncaught TypeError: Cannot read property 'name' of undefined。我希望我的 arr[5] 返回一个空字符串,而不是未定义的。我该怎么做?
  • @MikeMcCaughan,我明白了。谢谢你^_^

标签: javascript arrays


【解决方案1】:

使用这个:

xs = [
    {name: "Peter"},
    {name: "Doe"},
    {name: "Parker"},
    {name: "John"}
];

for (var i = 0; i < 5; i++) {
  console.log(setEmptyStr(xs[i] && xs[i].name));
}

function setEmptyStr(v) {
  if (typeof v !== 'undefined') {
    return v;
  } else {
    return '';
  }
}

首先测试xs[i] 可以防止错误尝试访问undefined 的属性。

【讨论】:

  • 非常感谢。它有效^_^
  • 代码块本身通常不是有用的答案,而且更有可能吸引反对票。请解释您所展示的解决方案的作用,以及该代码为何/如何回答问题。
  • 我写了一个解释。当我创建堆栈 sn-p 时,它显然消失了。
【解决方案2】:

不,您的代码中没有错误,但是在索引大于其长度的数组上循环是不安全的,它会抛出这种错误。

在您的代码中 xs[4] 将是 undefined 这就是您收到此错误的原因:

Uncaught TypeError: Cannot read property 'name' of undefined

所以你只需要像这样捕捉并避免这个错误:

for (var i = 0; i < 5; i++) {
    if(xs[i])
        console.log(setEmptyStr(xs[i].name));
}

【讨论】:

  • 非常感谢。是的,我现在明白我的错误是什么
【解决方案3】:

没有name不是未定义的:

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

所以实际上 xs[i] 是未定义的。您的循环运行 5 次,但您只有 4 个元素。您可能会使用 .length 来表示:

for(var i=0;i<xs.length;i++)

【讨论】:

  • OP 声明“我不想使用 array.length [sic]”
  • 提问者说,不想使用 array.length 你忘了注意
【解决方案4】:

这里,

for (var i = 0; i < 5; i++) {
    console.log(setEmptyStr(xs[i].name));
}

您正在尝试发送单个数组元素的name 而不检查其是否可用。在您的第 5 个条目中,您没有任何内容,因此它返回 undefined。因为你的数组长度是 4。

所以在这样发送之前检查你是否有object

if(xs[i]) {
  setEmptyStr(xs[i].name)
}

【讨论】:

  • 非常感谢你,它成功了^_^。在 setEmptyStr 之前使用 if 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
相关资源
最近更新 更多