2

我已经声明了一个二维数组,如下所示:

a = [[]]

但是,当我尝试使用 0 以外的第一个维度索引给出第二个维度值时,它不起作用:

a[1][0] = "foo" //returns error

有没有比手动将所需的每个索引定义为数组更好的方法,即:

a[1] = [];
a[2] = [];
a[3] = [];
//et cetera
4

6 回答 6

8

javascript 中不存在 N 维数组 - 您只需制作包含数组作为元素的数组。

您收到错误是因为a = [[]];声明了一个包含一个元素的数组,而该元素恰好也是一个数组。因此a[0]是内部数组,但a[1]不存在,因为您从未声明过它。正确声明“二维数组”的最简单方法是使用循环:

var outerArray = [];
var numInternalArrays = 5;
for (var i = 0; i < numInternalArrays; i++) {
    outerArray[i] = [];
}
于 2013-01-24T20:48:30.860 回答
5

如果你知道根数组应该有多少个元素,你可以这样做:

var arr = 
    (Math.pow(2,10)-1).toString(2)  // Binary string of 1s. Its length being 10
    .split('')                      // Create an array from this string
    .map(function(){return [];});   // Map a new empty array to each index

console.log(arr);                   // [[],[],[],[],[],[],[],[],[],[]]

这完成了同样的事情:

for(var arr = [], i=10; i--; arr[i]=[]);

arr由于javascript没有块作用域,因此无需在for循环之外声明,它将被添加到执行它的作用域中。

于 2013-01-24T21:46:12.397 回答
4
a = [[]]

这是一个数组,第一项是数组。这就是为什么索引到第一项仍然有效(a[0][0])。

如果要将第二项作为数组访问,则需要将数组创建为

a = [[],[]]

有关如何在 JavaScript 中创建二维数组的示例,请参阅此问题 ?

于 2013-01-24T20:47:43.177 回答
2

如果我理解正确,请使用循环:

for (var i = y; i--; a[i] = []);
于 2013-01-24T20:36:07.920 回答
1

javascript 中没有多维数组。
您正在做的是一个数组数组,但最外面的数组只有一个元素(即元素 0),其值是另一个数组。所以 a[1](或更一般地 a[1][x])是无效的,因为最外面的数组只有一个元素。
所以你可以做 a[0][x] = "foo" 但不能反过来。

因此,您可以使用 for 循环初始化数组,也可以执行类似 var a =[[][][][][]]; 之类的操作。

于 2013-01-24T20:46:53.573 回答
1

您可以让数组数组以如下方式开始:

var a = []; // start with the column array

然后,当您想将某些东西放在某个位置时,[i][j]我们可以将“i”称为行索引,将“j”称为列索引。

if (!a[i]) {   // check for row existing
    a[i] = []; // .. and create it if not 
}
a[i][j] = 'foo'; // put something in the array cell

请注意,这只有效,因为我们总是在创建新行数组后立即将其放入新行数组中。如果你把 0 或 "" 放在那里而不是 'foo',它可能不起作用。

javascript中有很多“假”的东西,包括“空”、“未定义”和“0”,我只是不知道一个空数组或一个包含一个空字符串元素的数组是否被认为是假的. 因此,您必须进行一些实验,以准确检测丢失的行数组,以便将其添加进去。

于 2013-01-24T21:24:59.217 回答