在Javascript中声明一个空的二维数组?

Zan*_*nix 56 javascript arrays 2d push dynamic

我想在Javascript中创建一个二维数组,我将存储坐标(x,y).我不知道我将拥有多少对坐标,因为它们将由用户输入动态生成.

预定义的2d数组的示例:

var Arr=[[1,2],[3,4],[5,6]];
Run Code Online (Sandbox Code Playgroud)

我想我可以使用PUSH方法在数组的末尾添加一条新记录.

如何声明一个空的二维数组,这样当我使用我的第一个Arr.push()时,它将被添加到索引0,而push写入的每个下一个记录都将采用下一个索引?

这可能很容易做到,我只是JS的新手,如果有人能写一个我可以检查的简短工作代码片段,我将不胜感激.谢谢

DJG*_*DJG 73

您可以像这样声明一个常规数组:

var arry = [];
Run Code Online (Sandbox Code Playgroud)

然后,当您有一对要添加到数组的值时,您需要做的就是:

arry.push([value_1, value2]);
Run Code Online (Sandbox Code Playgroud)

是的,第一次调用时arry.push,这对值将放在索引0处.

来自nodejs repl:

> var arry = [];
undefined
> arry.push([1,2]);
1
> arry
[ [ 1, 2 ] ]
> arry.push([2,3]);
2
> arry
[ [ 1, 2 ], [ 2, 3 ] ]
Run Code Online (Sandbox Code Playgroud)

当然,由于javascript是动态类型的,因此没有类型检查器强制该数组保持二维.您必须确保只添加坐标对,而不是执行以下操作:

> arry.push(100);
3
> arry
[ [ 1, 2 ],
  [ 2, 3 ],
  100 ]
Run Code Online (Sandbox Code Playgroud)

  • 您只需检索arry [0] [0]即可.(要获得Y坐标,您可以检索arry [0] [1].) (2认同)

Lor*_*ngi 23

如果你想能够像矩阵[i] [j]那样访问矩阵

我发现在循环中初始化它最方便.

var matrix = [],
    cols = 3;

//init the grid matrix
for ( var i = 0; i < cols; i++ ) {
    matrix[i] = []; 
}
Run Code Online (Sandbox Code Playgroud)

这会给你[[],[],[]]

所以matrix [0] [0] matrix [1] [0]返回undefined而不是错误"Uncaught TypeError:无法设置属性'0'未定义"


Abh*_*avD 22

如果要与创建一起初始化,可以使用填充贴图.

const matrix = new Array(5).fill(0).map(() => new Array(4).fill(0));
Run Code Online (Sandbox Code Playgroud)

5是行数,4是列数.

  • 另请注意,这里`map(()=&gt; {})`用于创建独立行,这是必要的。new Array(5).fill(new Array(4).fill(0))的方式是非常危险的举动。由于所有行都填充了对一个数组的引用,因此,如果更新`arr [0] [0]`,那么`arr [1] [0]`的值也会更改。当您将此数组用作缓存表时,这可能会引起非常严重的黑暗问题。 (4认同)
  • @Kaihua我是JavaScript新手,但使用了下面Kamil Kiełczewski提供的打印格式代码,Abhinav的解决方案没有问题。如果修改任何元素,则任何其他元素*不会*发生变化。我认为你的评论类似于 Python 中的浅拷贝,但这里的情况并非如此。 (2认同)
  • @RamzanChasygov 语言可能不完美,具体取决于上下文 =D (2认同)

Kam*_*ski 14

ES6

矩阵m大小为3行5列

[...Array(3)].map(x=>Array(5).fill(0))       
Run Code Online (Sandbox Code Playgroud)

[...Array(3)].map(x=>Array(5).fill(0))       
Run Code Online (Sandbox Code Playgroud)

删除.fill(0)不初始化为零。奖金

let m = [...Array(3)].map(x=>Array(5).fill(0));

m[1][0] = 2;  // second row, first column
m[2][4] = 8;  // last element

// print formated array
console.log(JSON.stringify(m)
  .replace(/(\[\[)(.*)(\]\])/g,'[\n  [$2]\n]').replace(/],/g,'],\n  ')
);
Run Code Online (Sandbox Code Playgroud)


Kev*_*sox 6

您可以使用简写语法将一个数组嵌套在另一个数组中:

   var twoDee = [[]];
Run Code Online (Sandbox Code Playgroud)


小智 6

一班轮

let m = 3 // rows
let n = 3 // columns
let array2D = Array(m).fill().map(entry => Array(n))
Run Code Online (Sandbox Code Playgroud)

此实现为每个条目创建一个唯一的子数组。因此设置array2D[0][1] = 'm'不会将每个条目的 [1] 索引设置为“m”


小智 6

这个应该可以工作:

\n
const arr = new Array(5).fill().map(_ => new Array(5).fill(0)) // \xe2\x9c\x85\n
Run Code Online (Sandbox Code Playgroud)\n

你可能会问我为什么使用地图而不是:

\n
const badArr = new Array(5).fill(new Array(5).fill(0)) // \xe2\x9d\x8c\n
Run Code Online (Sandbox Code Playgroud)\n

上面示例的问题在于它添加了对传递到 fill 方法中的数组的引用:

\n

在此输入图像描述

\n

虽然这个效果很好:

\n

在此输入图像描述

\n


Rah*_*thi 5

你可以尝试这样的事情: -

var arr = new Array([]);
Run Code Online (Sandbox Code Playgroud)

推送数据:

arr[0][0] = 'abc xyz';
Run Code Online (Sandbox Code Playgroud)

  • `arr [1] [0] = 3` =&gt;`Uncaught TypeError:无法设置未定义的属性'0'。 (4认同)