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

时间:2015-06-04 18:01:04

标签: javascript functional-programming ecmascript-6 ecmascript-harmony

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

G*

我试过了,

G

但转换为

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

这不是我的预期。

编辑:

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

return [ ...7 ].map(i => {
  return i * i;
});

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

3 个答案:

答案 0 :(得分:152)

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

Array(8).fill().map((_, i) => i * i);

答案 1 :(得分:59)

ES7提案

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

您可以随时使用:

[for (i of Array(7).keys()) i*i];

在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 ]

然后你可以这样做:

[for (i of range(5)) i*i] // 0, 1, 4, 9, 16, 25
[for (i of range(5,3)) i*i] // 9, 16, 25

ES6

这是一个很好的方法:

[...Array(7).keys()].map(i => i * i);
Array(7).fill().map((_,i) => i*i);
[...Array(7)].map((_,i) => i*i);

这将输出:

  

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

答案 2 :(得分:15)

这是使用生成器的方法:

function* square(n) {
    for (var i = 0; i < n; i++ ) yield i*i;
}

然后你可以写

console.log(...square(7));

另一个想法是:

[...Array(5)].map((_, i) => i*i)

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

或者,我们可以写

Array.from(Array(5)).map((_, i) => i*i)

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

Array.from(Array(5), (_, i) => i*i)

我最近看到的一个可怕的黑客,建议你使用

[...1e4+''].map((_, i) => i*i)