无法在数组中填充数组 - Javascript

时间:2011-04-20 07:22:27

标签: javascript arrays multidimensional-array

所以我在一个数组中有一个数组。它被称为r0w。这是它的样子:

r0w[0] = [1,38,0,63,20,39,1,36,36,36,34,35,35,36,36,37,1]
r0w[1] = [1,38,63,124,20,101,1,36,36,36,34,35,35,36,36,37,1]
r0w[2] = [1,38,124,185,20,162,1,36,36,36,34,35,35,36,36,37,1]
r0w[3] = [1,48,185,248,25,224,1,44,37,103,35,92,1]

现在我想对数组中的这些数组执行一些计算,并将其输出到名为absw1dth的数组中的另一个数组。这是我的代码。

var absw1dth = [[]];

for (e=0 ; e < r0w.length ; e++ ) {
    absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );
    for (f=8 ; f < r0w[e].length ; f++ ) {
        absw1dth[e][f - 7] = (r0w[e][f] + absw1dth[e][f - 8]);
        };
    };

它在此行中不断出错

absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );

并说undefined不是一个对象。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

问题在于abswidth的初始化。你已经完成了这个

var absw1dth = [[]];

...将创建一个包含一个元素的数组,另一个数组不包含任何元素。因此,当e1(而不是0)时,表达式absw1dth[e][0]正在尝试索引到不存在的数组abswidth[1]

如果数据与您显示的一样是静态的(r0w数组中总是只有四行),您可以通过初始化来解决它:

var absw1dth = [ [], [], [], [] ];

现在abswidth是一个四元素数组,其中每个元素都是一个空数组。

但如果数据更具动态性,我可能会即时初始化:

var absw1dth = []; // Just an empty array

for (e=0 ; e < r0w.length ; e++ ) {
    abswidth[e] = []; // Create this element
    absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );
    for (f=8 ; f < r0w[e].length ; f++ ) {
        absw1dth[e][f - 7] = (r0w[e][f] + absw1dth[e][f - 8]);
        };
    };
    // ...
}

如果您未展示的代码可能已在abwidth内创建了数组元素,但也可能没有,则可以先测试:

var absw1dth = []; // Just an empty array

for (e=0 ; e < r0w.length ; e++ ) {
    if (!abswidth[e]) {
        abswidth[e] = []; // Create this element
    }
    absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );
    for (f=8 ; f < r0w[e].length ; f++ ) {
        absw1dth[e][f - 7] = (r0w[e][f] + absw1dth[e][f - 8]);
        };
    };
    // ...
}

或者全部使用“函数式编程”并使用JavaScript的curiously-powerful || operator

var absw1dth = []; // Just an empty array

for (e=0 ; e < r0w.length ; e++ ) {
    abswidth[e] = abswidth[e] || []; // Create this element if needed
    absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );
    for (f=8 ; f < r0w[e].length ; f++ ) {
        absw1dth[e][f - 7] = (r0w[e][f] + absw1dth[e][f - 8]);
        };
    };
    // ...
}

答案 1 :(得分:1)

尝试:

var absw1dth = [];

for (e=0 ; e < r0w.length ; e++ ) {
    absw1dth[e] = [];
    absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );
    //...

答案 2 :(得分:1)

absw1dth[e][0]不是对象,因为absw1dth[e]还不是对象。

尝试absw1dth[e] = []; absw1dth[e][0] = ( r0w[e][7] + r0w[e][1] );