函数方式来遍历范围(ES6 / 7)

使用更多function的方式做什么是最好的方式(与ES6 / ES7)

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

我试过,

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

但是被翻译成

 [].concat(7).map(function (n) { return n * n; }); 

这不是我所期望的。

编辑:

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

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

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

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

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

ES7提案

你总是可以使用像这样的东西:

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

在Firefox上运行此代码:

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

这适用于Firefox(这是一个build议的ES7function),但它已经从规格中删除。 IIRC,巴贝尔5与“实验”启用支持这一点。

这是你最好的select,因为arrays理解只是用于这个目的。 你甚至可以写一个范围函数来完成这个任务:

 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]

这是一个使用生成器的方法:

 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)创build一个未填充的五元素数组。 这就是Array给定一个参数时的工作方式。 我们使用spread运算符来创build一个包含五个未定义元素的数组。 那我们就可以映射了。 请参阅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) 

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

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