" undefined不是一个对象"什么时候创建multidivisional数组

时间:2015-11-22 23:03:00

标签: javascript multidimensional-array

我写了代码:

    var from = 6;
    var io_arr = [0, 1, 2, 3];
    var mem_arr = [0, 1, 2, 3];
    var cpu_arr = [0, 1, 2, 3];

    var x = new Array(io_arr.length);
    for (var i = 0; i < io_arr.length; i++) {
        x[i] = new Array(4);
    }

    for (var i = 1; i <= io_arr.length; i++) {
        for (var j = 0; j <= 3; j++) {
            if(j == 0) {
                x[i][j] = from + i - 1;
            }
            if (j == 1) {
                x[i][j] = io_arr[i];
            }
            if (j == 2) {
                x[i][j] = mem_arr[i];
            }
            if (j == 3) {
                x[i][j] = cpu_arr[i];
            }
        }
    } 

有错误

TypeError: undefined is not an object (evaluating 'x[i][j] = io_arr[i]')

这有什么问题?我对JS很新,很抱歉,如果答案很明显的话。

3 个答案:

答案 0 :(得分:0)

我的猜测: for (var i = 1; i <= io_arr.length; i++)需要:for (var i = 0; i < io_arr.length; i++) 或者,您是否有特定原因在第二个for循环中对其进行了修改?

答案 1 :(得分:0)

for (var i = 1; i <= io_arr.length; i++) {

是错误的,第一个索引是0而不是1.你走得太远,因为最后一个索引不是io_arr.length的值,而是小于长度的一个(因为它从0开始;)) 这应该有效:

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

我通过更改此行来检查代码,并且不会抛出任何错误。这只是您必须习惯的一些编程基础

答案 2 :(得分:0)

所以我的原始建议(在评论中)是在同一循环中执行两个操作。这将允许您摆脱两行代码。所以

var x = new Array(io_arr.length);
for (var i = 0; i < io_arr.length; i++) {
    x[i] = new Array(4);
}

for (var i = 1; i <= io_arr.length; i++) {
    for (var j = 0; j <= 3; j++) {
        if(j == 0) {
            x[i][j] = from + i - 1;
        }
        if (j == 1) {
            x[i][j] = io_arr[i];
        }
        if (j == 2) {
            x[i][j] = mem_arr[i];
        }
        if (j == 3) {
            x[i][j] = cpu_arr[i];
        }
    }
} 

将被替换为

var x = new Array(io_arr.length);
for (var i = 0; i < io_arr.length; i++) {
    x[i] = new Array(4);
    for (var j = 0; j <= 3; j++) {
        if(j == 0) {
            x[i][j] = from + i - 1;
        }
        if (j == 1) {
            x[i][j] = io_arr[i];
        }
        if (j == 2) {
            x[i][j] = mem_arr[i];
        }
        if (j == 3) {
            x[i][j] = cpu_arr[i];
        }
    }
} 

问题是您希望x的第一行为空。您可以通过在循环中添加if语句在单个循环中执行此操作:

var x = new Array(io_arr.length);
for (var i = 0; i < io_arr.length; i++) {
    x[i] = new Array(4);
    if (x === 0) continue;
    for (var j = 0; j <= 3; j++) {
        if(j === 0) {
            x[i][j] = from + i - 1;
        }
        if (j === 1) {
            x[i][j] = io_arr[i];
        }
        if (j === 2) {
            x[i][j] = mem_arr[i];
        }
        if (j === 3) {
            x[i][j] = cpu_arr[i];
        }
    }
} 

这应该会给你你想要的答案。

请注意,我已将==更改为===,这应该始终是首选,因为==会执行奇怪的转换,而Javascript纯粹主义者并不喜欢它