如何使用one liner for for循环在JavaScript中创建网格?

时间:2017-05-17 19:14:57

标签: javascript arrays

晚上好的程序员社区! 是否可以在Javascript中创建一个单线阵列。为了使我的问题更清楚,我想模仿以下我在Python上用Python做的一个班轮:

>>> arrAy=[['_' for i in range(10)] for j in range(10)]

得出以下结果:

>>> for i in arrAy:
    print(i)
>>> [['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_'],
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_']]

谢谢

2 个答案:

答案 0 :(得分:2)

首先,您需要定义range generator,因为没有内置等效项:

function* range(n) {
  for (let i = 0; i < n; i++) yield i;
}

然后,您需要将generator comprehension替换为for循环,因为理解是JavaScript中的非标准功能,并且将来不太可能添加到ECMAScript中。

const arrAy = [];
for (let i of range(10)) {
  let row = [];
  for (let j of range(10)) row.push('_');
  arrAy.push(row);
}

这非常接近基于生成器的python原创,但既不是惯用的JavaScript也不是单行。此外,您不需要生成器,因为无论如何都要将整个结果存储在数组中。

基于非发电机的单线程可能如下所示:

const arrAy = Array.from({length: 10}, () => Array.from({length: 10}, () => '_'));

或更短

const arrAy = Array.from({length: 10}, () => Array(10).fill('_'));

当然,正如评论中所概述的那样,你可以将普通的for-loop压缩成一个单行,但这是代码缩小器的工作,而不是程序员。

答案 1 :(得分:0)

是的,您可以使用mapfill的魔力。

&#13;
&#13;
const grid = (width, height, value) => new Array(width)
  .fill(null)
  .map(v => new Array(height)
    .fill(value));
const grid10x10 = grid(10, 10, "_");
console.log(grid10x10);  // tada!
&#13;
&#13;
&#13;