你如何轻松创建空矩阵javascript?

pri*_*stc 48 javascript

在python中,你可以这样做:

[([None] * 9) for x in range(9)]
Run Code Online (Sandbox Code Playgroud)

你会得到这个:

[[None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None]]
Run Code Online (Sandbox Code Playgroud)

如何在javascript中执行等效操作?

Ric*_*uen 63

var matrix = [];
for(var i=0; i<9; i++) {
    matrix[i] = new Array(9);
}
Run Code Online (Sandbox Code Playgroud)

... 要么:

var matrix = [];
for(var i=0; i<9; i++) {
    matrix[i] = [];
    for(var j=0; j<9; j++) {
        matrix[i][j] = undefined;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这不是空的.只需用`matrix [j] = new Array(9)`替换内部循环 (4认同)
  • 使用两种不同的范式来创建数组,首先是一个循环,然后是一个构造函数,这在智力上有点令人不满意。 (3认同)

小智 63

Array.fill

考虑使用fill:

Array(9).fill().map(()=>Array(9).fill())
Run Code Online (Sandbox Code Playgroud)

这里的想法是fill()将填写项目undefined,这足以让map他们开始工作.

你也可以直接填写:

Array(9).fill(Array(9))
Run Code Online (Sandbox Code Playgroud)

替代方案Array(9).fill()包括

Array(...Array(9))
[].push(...Array(9))
[].concat(Array(9))
Array.from(Array(9))
Run Code Online (Sandbox Code Playgroud)

我们可以在语义上重写解决方案:

function array9() { return Array(9).fill(); }
array9().map(array9)
Run Code Online (Sandbox Code Playgroud)

要么

function array(n) { return Array(n).fill(); }
array(9).map(() => array(9))
Run Code Online (Sandbox Code Playgroud)

Array.from 为我们提供了一个可选的第二个映射参数,因此我们可以选择写入

Array.from(Array(9), () => Array.from(Array(9));
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意

function array9(map) { return Array.from(Array(9), map); }
array9(array9);
Run Code Online (Sandbox Code Playgroud)

有关详细说明和示例,请参阅Array.prototype.fill() 此处的 Mozilla文档.
而且Array.from(),在这里.

请注意,Internet Explorer 中既不支持Array.prototype.fill()也不Array.from()支持.上述MDN链接提供了IE的polyfill.

分区

partition(Array(81), 9)
Run Code Online (Sandbox Code Playgroud)

如果你有一个partition实用的方便.这是一个快速递归的:

function partition(a, n) {
  return a.length ? [a.splice(0, n)].concat(partition(a, n)) : [];
}  
Run Code Online (Sandbox Code Playgroud)

循环

我们可以更有效地循环

var a = [], b;
while (a.push(b = []) < 9) while (b.push(null) < 9);
Run Code Online (Sandbox Code Playgroud)

利用push返回新数组长度的事实.

  • 请注意,使用`Array(9).fill(Array(9))`会将每一行设置为_same_数组,这意味着更改一行将影响其他行.请参阅此CodePen作为示例:https://codepen.io/anon/pen/bMxjaG?edit = 0012 (12认同)
  • 应该进行编辑,因为 `Array(9).fill(Array(9))` 是一段非常危险的代码。 (3认同)
  • 尽量避免`Array(9).fill(Array(9))`!它将浅拷贝传递到每一行,如果更改其中的任何项目,它将更改所有列。 (3认同)
  • 非常彻底。很好的回应! (2认同)

cau*_*aub 11

// initializing depending on i,j:
var M=Array.from({length:9}, (_,i) => Array.from({length:9}, (_,j) => i+'x'+j))

// Print it:

console.table(M)
// M.forEach(r => console.log(r))
document.body.innerHTML = `<pre>${M.map(r => r.join('\t')).join('\n')}</pre>`
// JSON.stringify(M, null, 2) // bad for matrices
Run Code Online (Sandbox Code Playgroud)

注意下面这样做是错误的:

// var M=Array(9).fill([]) // since arrays are sparse
// or Array(9).fill(Array(9).fill(0))// initialization

// M[4][4] = 1
// M[3][4] is now 1 too!
Run Code Online (Sandbox Code Playgroud)

因为它创建了相同的数组引用次数9次,所以修改项目也会修改其他行的相同索引处的项目(因为它是相同的引用),因此您需要在要复制的行上另外调用.slice或.map他们(参见torazaburo在这个陷阱中失败的答案)

注意:将来可能看起来像这样,使用切片符号 - 文字提案(第1阶段)

const M = [...1:10].map(i => [...1:10].map(j => i+'x'+j))
Run Code Online (Sandbox Code Playgroud)


Hec*_*Guo 5

也有一些是Array.fill我必须要提到。

如果只是使用下面的方法创建一个3x3矩阵。

Array(3).fill(Array(3).fill(0));
Run Code Online (Sandbox Code Playgroud)

您会发现矩阵中的值是参考。

在此处输入图片说明


优化的解决方案(防止通过引用传递):

如果您要传递价值而不是参考,则可以利用Array.map它来创造价值。

Array(3).fill(null).map(() => Array(3).fill(0));
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明