在下面的代码中,我继续得到while循环的条件语句的错误TypeError: Cannot read properties of undefined (reading '0').

var testObj = {
    1: 1,
    2: 2,
    3: 3,
    4: 4,
    5: 5,
    6: 6,
    7: 7,
    8: 8,
    9: 9
};

var testArr = [
    [1, []],
    [2, []],
    [3, []],
    [4, []],
    [5, []],
    [6, []],
    [7, []],
    [8, []],
    [9, []]
];

(_ => {
    for (let x in testObj) {
        let i = 0;
        while (x !== testArr[i][0]) {
            i++;
        }
        testArr[i][1].push(x);
    }
})();

为了解释代码是如何工作的,假定匿名函数迭代对象中的每一项.在每次迭代期间,While循环将用于在嵌套数组中查找第一个数据点(索引0)是与对象的当前数据点匹配的数字的数组,然后将该数据点推入位于该数组中索引1处的空数组中.

(这是一个较大程序的简化版本,用于测试目的.我知道代码是多余的,因为所有数字都是有序的,但在主程序中情况并非如此.)

然而,由于上述类型错误,程序在进入While循环时崩溃.

我已经确认这不是作用域问题,因为我可以从While循环内部访问array.我还确认了对嵌套数组中的任何数据点的硬调用也是有效的,所以我不认为这是一个语法错误.我能想到的这个问题的唯一可能原因是,在While循环中使用i时,它不知何故不是一个数字,但我不知道这是如何发生的.

推荐答案

  1. while循环中,当i超过数组大小时,您不会判断条件.它在寻找testArr[9],它将是undefined,因为testArr中只有8个元素.
  2. 你可能会问,为什么它会进入第9个指数--因为是Keys in javascript objects can only be strings.因此,您要将字符串'1'与整数1进行比较,这会导致FALSE,因此循环会不断递增.

您可以将!==更改为!=,或将字符串键转换为整数键-

(_ => {
    for (let x in testObj) {
        let i = 0;
        while (x != testArr[i][0]) {
            i++;
        }
        testArr[i][1].push(x);
    }
})();
(_ => {
    for (let x in testObj) {
        // Convert string to int
        x = parseInt(x);
        let i = 0;
        while (x !== testArr[i][0]) {
            i++;
        }
        testArr[i][1].push(x);
    }
})();

Javascript相关问答推荐

SignalR连接.start().then()未按预期工作

复合密钥查找在mongoDB中未按预期工作

使用Element.children在前后移动 node

添加/删除时React图像上传重新渲染上传的图像

React对话框模式在用户单击预期按钮之前出现

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

在JS中获取名字和姓氏的首字母

Vega中的模运算符

如何最好地从TypScript中的enum获取值

React 17与React 18中的不同setState行为

使用i18next在React中不重新加载翻译动态数据的问题

如何修复(或忽略)HTML模板中的TypeScript错误?'

空的结果抓取网站与Fetch和Cheerio

还原器未正确更新状态

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

使用Java脚本导入gltf场景并创建边界框

rxjs插入延迟数据

如何确保预订系统跨不同时区的日期时间处理一致?

P5.js中的分形树