如何在 JavaScript 中创建二维数组?

IT技术 javascript arrays multidimensional-array
2021-01-09 21:26:50

我一直在网上阅读,有些地方说不可能,有些人说是,然后举个例子,其他人反驳这个例子,等等。

  1. 如何在 JavaScript 中声明一个二维数组?(假设有可能)

  2. 我将如何访问其成员?myArray[0][1]myArray[0,1]?)

6个回答

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);

以这种方式初始化大型多维数组会很困难。但是,此函数可用于创建一个空的多维,并将维度指定为参数。
2021-03-14 21:26:50
你应该经历整个事情......例如 alert(items[0][1]); // 2 等
2021-03-25 21:26:50
@AndersonGreen 您为对多维数组解决方案感兴趣的人提供了一个链接,这是一件好事,但问题和 Ballsacian1 的答案是关于“二维”数组,而不是“多维”数组
2021-03-26 21:26:50
@SashikaXP,这不适用于 0 以外的第一个索引。
2021-03-28 21:26:50
问题是如何声明一个二维数组。这就是我正在寻找的内容,并找到了这个和以下无法区分声明和初始化之间区别的答案。还有已知长度或无界的声明,这两个都没有讨论。
2021-04-05 21:26:50

您只需将数组中的每个项目设为一个数组。

var x = new Array(10);

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

console.log(x);

不起作用 - 分配错误。如果这个答案没用,怎么会得到 280 个赞?
2021-03-12 21:26:50
这是工作,谢谢。你可以看到例子 Gargo jsfiddle.net/matasoy/oetw73sj
2021-03-23 21:26:50
他们可以使用字符串之类的东西作为键和值吗?myArray['Book']['item1'] ?
2021-03-24 21:26:50
我比接受的答案更喜欢这个例子,因为这可以为动态大小的数组实现,例如new Array(size)wheresize是一个变量。
2021-03-26 21:26:50
@Diego,是的,但这不是数组的用途。当您的键是字符串时,最好使用对象。
2021-03-29 21:26:50

与 activa 的回答类似,这里有一个创建 n 维数组的函数:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]
这可以创建一个 4 维数组吗?
2021-03-11 21:26:50
@trusktr:是的,您可以根据需要创建任意数量的维度(在您的内存限制内)。只需传入四个维度的长度即可。例如,var array = createArray(2, 3, 4, 5);
2021-03-12 21:26:50
@haykam 抱歉浪费你的时间 - 我是在讽刺:/
2021-03-27 21:26:50
最佳答案 !但是,我不建议将它与 0 或 1 个参数一起使用(无用)
2021-04-04 21:26:50
@BritishDeveloper是的。这是一个 5D 数组,每个长度为 5:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
2021-04-05 21:26:50

如何创建一个空的二维数组(一行)

Array.from(Array(2), () => new Array(4))

2和4分别是第一维和第二维。

我们正在使用Array.from,它可以采用类似数组的参数和每个元素的可选映射。

Array.from(arrayLike[, mapFn[, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

可以使用相同的技巧来创建包含 1...N 的 JavaScript 数组


或者(但效率低12% n = 10,000

Array(2).fill(null).map(() => Array(4))

性能下降的原因是我们必须将第一个维度值初始化为 run .map请记住,Array在您通过.fill或直接值分配对其进行排序之前不会分配位置

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


跟进

这是一种看似正确但存在问题的方法

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

虽然它确实返回了显然需要的二维数组 ( [ [ <4 empty items> ], [ <4 empty items> ] ]),但有一个问题:第一维数组已通过引用复制。这意味着 aarr[0][0] = 'foo'实际上会更改两行而不是一行。

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);

这里是主观的,但这个答案(其中的第一个和第二个)似乎是简洁、快速和现代的最佳平衡。
2021-03-13 21:26:50
@zurfyx 有什么想法,或者有谁知道,为什么 webstorm 会抱怨这个?似乎 array.from 一直将值保留为未定义,然后我无法使用创建的数组,即使该代码段在 stackoverflow 上运行良好
2021-03-16 21:26:50
这是迄今为止在 JavaScript 中创建大型空多维数组的最佳方式
2021-03-19 21:26:50
我建议这样做: Array.from({length:5}, () => [])
2021-03-21 21:26:50
最好的单行答案!
2021-03-26 21:26:50

Javascript 只有一维数组,但正如其他人指出的那样,您可以构建数组数组。

以下函数可用于构造固定维度的二维数组:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

列数并不重要,因为在使用数组之前不需要指定数组的大小。

然后你可以打电话:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
@Doug:您实际上想要一个具有 2 个属性的一维对象数组。var 甲板 = []; 甲板[0] = {脸:1,西装:'H'};
2021-03-14 21:26:50
@DougHauf 那是一个缩小的二维数组??:P :D
2021-03-27 21:26:50
函数 Create2DArray(rows) { var arr = []; for (var i=0;i<rows;i++) { arr[i] = []; } 返回 arr; } function print(deck) { for(t=1;t<=4;t++) { for (i=1;i<=13;i++) { document.writeln(deck[t][i]); } } } 函数fillDeck(d) { for(t=1;t<=4;t++) { myCardDeck[t][1] = t; for (i=1;i<=13;i++) { myCardDeck[t][i] = i; } } } function loadCardDeck() { var myCardDeck = Create2DArray(13); 填充甲板(myCardDeck);打印(myCardDeck);}
2021-03-30 21:26:50
我想制作一个二维数组来代表一副纸牌。这将是一个 2 维数组,其中包含卡值,然后是花色。什么是最简单的方法来做到这一点。
2021-04-01 21:26:50