迭代范围的功能方式(ES6/7)

bsr*_*bsr 108 javascript functional-programming ecmascript-harmony ecmascript-6

以更多功能方式执行以下操作的最佳方法是什么(使用ES6/ES7)

let cols = [];
for (let i =0; i <= 7; i++) {
   cols.push(i * i);
}
return cols;
Run Code Online (Sandbox Code Playgroud)

我试过,

return [ ...7 ].map(i => {
  return i * i;
});
Run Code Online (Sandbox Code Playgroud)

但那转化为

[].concat(7).map(function (n) {
  return n * n;
});
Run Code Online (Sandbox Code Playgroud)

这不是我的预期.

编辑:

@pavlo.的确,这是一个错误.我正在使用JSX,例如,我想要7个div,(未经测试)

let cols = [];
    for (let i =0; i <= 7; i++) {
       cols.push(<div id={i}> ...  </div>)
    }
    return cols;
Run Code Online (Sandbox Code Playgroud)

所以这个想法确实是为了减少临时变量和程序感觉的数量.

Pav*_*vlo 170

可以创建一个空数组,填充它(否则map会跳过它),然后将索引映射到值:

Array(8).fill().map((_, i) => i * i);
Run Code Online (Sandbox Code Playgroud)

  • 如果不需要map中的结果数组,而您想在其中保留“ for”一词,则可以使用Array(8).fill()。forEach((_,i)=&gt; console.log( i))`或`[... Array(8)]。forEach((_,i)=&gt; console.log(i))` (3认同)
  • 请注意,除非您将“undefined”添加为“fill”的第一个参数,否则此代码在 Typescript 中将失败。根据[此 github 问题](https://github.com/microsoft/TypeScript/issues/25392#issuecomment-804255033),Typescript 维护者似乎反对“Array.prototype.fill”的这种特定使用。 (3认同)
  • 或者 `Array.from({length: 8}, (_, i) =&gt; i * i)`。 (2认同)
  • 创建一个数组只是为了循环一定次数,这是 JavaScript 的峰值。 (2认同)

Dow*_*oat 61

ES7提案

警告:不幸的是,我相信大多数流行的平台已经放弃了对理解的支持.请参阅下面的支持良好的ES6方法

您总是可以使用以下内容:

[for (i of Array(7).keys()) i*i];
Run Code Online (Sandbox Code Playgroud)

在Firefox上运行此代码:

[0,1,4,9,16,25,36]

这适用于Firefox(它是一个提议的ES7功能),但它已从规范中删除.IIRC,启用"实验"的Babel 5支持此功能.

这是你最好的选择,因为数组理解仅用于此目的.你甚至可以编写一个范围函数来配合:

var range = (u, l = 0) => [ for( i of Array(u - l).keys() ) i + l ]
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

[for (i of range(5)) i*i] // 0, 1, 4, 9, 16, 25
[for (i of range(5,3)) i*i] // 9, 16, 25
Run Code Online (Sandbox Code Playgroud)

ES6

一个很好的方法来做到这一点:

[...Array(7).keys()].map(i => i * i);
Array(7).fill().map((_,i) => i*i);
[...Array(7)].map((_,i) => i*i);
Run Code Online (Sandbox Code Playgroud)

这将输出:

[0,1,4,9,16,25,36]

  • 数组理解不是ES7的一部分.据我所知,它甚至不再是一个提议. (2认同)
  • 至少不要声称他们在ES7中.这只会让人感到困惑.我不认为Babel再支持他们了:https://babeljs.io/docs/plugins/. (2认同)

小智 16

这是使用生成器的方法:

function* square(n) {
    for (var i = 0; i < n; i++ ) yield i*i;
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以写了

console.log(...square(7));
Run Code Online (Sandbox Code Playgroud)

另一个想法是:

[...Array(5)].map((_, i) => i*i)
Run Code Online (Sandbox Code Playgroud)

Array(5)创建一个未填充的五元素数组.Array当给出单个参数时,这是如何工作的.我们使用spread运算符创建一个包含五个未定义元素的数组.然后我们可以映射.见http://ariya.ofilabs.com/2013/07/sequences-using-javascript-array.html.

或者,我们可以写

Array.from(Array(5)).map((_, i) => i*i)
Run Code Online (Sandbox Code Playgroud)

或者,我们可以利用第二个参数Array#from来跳过map和写

Array.from(Array(5), (_, i) => i*i)
Run Code Online (Sandbox Code Playgroud)

我最近看到的一个可怕的黑客,我推荐你使用,是

[...1e4+''].map((_, i) => i*i)
Run Code Online (Sandbox Code Playgroud)

  • `Array(... Array(5))`更好地表示为`[... Array(5)]`. (10认同)