【问题标题】:undefined items from array in TypeScript for loopTypeScript for循环中数组中的未定义项
【发布时间】:2016-07-07 08:01:58
【问题描述】:

当我在某个 REST 服务上设置匿名回调函数时,我得到一个非常奇怪的行为,如果我只是 console.log REST 服务的结果,我会得到预期的有效负载(对象数组) .但是,当我在同一个数组上运行一个循环并尝试获取某个键的值时,我收到一个错误,因为该项目显然是 undefined

...
callback: (result) => {
    console.log(result); // outputs [{text: 'foo'}, {text: 'bar'}]
    for(let item of result){
        console.log(item.text); // error can't read text of undefined
        console.log(item); // HOWEVER... this works... :/
    }
}

有什么想法吗?一定是发生了某种异步行为,但我想不通。

谢谢!

【问题讨论】:

  • 这不是打字稿错误,这只是 JavaScript
  • 知道为什么会出现此错误吗?谢谢
  • Everything seems to work 符合预期。你确定response 真的和评论中的一样吗?
  • 使用 item['text'] 代替 item.text。它肯定可以工作......
  • 这是您的实际代码还是您为问题简化了它?你用断点调试过吗?

标签: javascript arrays typescript angular


【解决方案1】:

您很可能有一个格式错误的数组。这是一个演示问题的示例:

// Malformed array
const result = [
    {text: 'foo'},
    {text: 'bar'},
]
result.length = 3;

// Your code
console.log(result); // outputs [{text: 'foo'}, {text: 'bar'}]
for(let item of result){
    console.log(item.text); // error can't read text of undefined
    console.log(item); // HOWEVER... this works... :/
}

修复

  • 过滤掉空项。

更多提示

  • console.log 将为不合理的内容打印一个空行。您可能在调试中看不到这一点
  • 阅读 JavaScript 数组漏洞
  • 享受生活?

【讨论】:

    【解决方案2】:

    这不是你迭代数组的方式。您应该使用完整的 for 循环或 forEach 函数:

    for(let i = 0, l = result.length; i < l; i++) {
        console.log(result[i].text);
     }
    

    result.forEach((item) => {
       console.log(item);
    });
    

    【讨论】:

    • 他的循环版本在 TypeScript 操场上工作得非常好(无论如何它都会被转换为您的第一个示例),但为 forEach +1。
    • 谢谢,我试试看。即使它在操场上运行良好,它也必须与 REST 服务的结果有关。也许与在他们真正得到完整响应之前取回承诺和迭代有关,但不确定。我是 TypeScript 新手,所以不知道如何调试。
    • 此规则适用于使用for ... infor ... of 用于集合
    猜你喜欢
    • 2011-09-28
    • 2020-03-25
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多