Javascript 迭代范围的函数方式(ES6/7)

Javascript 迭代范围的函数方式(ES6/7),javascript,functional-programming,ecmascript-6,ecmascript-harmony,Javascript,Functional Programming,Ecmascript 6,Ecmascript Harmony,以更实用的方式(使用ES6/ES7)执行以下操作的最佳方法是什么 但这意味着 [].concat(7).map(function (n) { return n * n; }); 这不是我所期望的 编辑: @帕夫洛。事实上,这是一个错误。我使用的是JSX,例如,我想要7个div(未测试) 让cols=[]; 对于(设i=0;i ES7提案) 警告:不幸的是,我认为大多数流行的平台已经放弃了对理解的支持。请参阅下面的ES6方法 您始终可以使用以下内容: [for (i of Array(7).

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

但这意味着

[].concat(7).map(function (n) {
  return n * n;
});
这不是我所期望的

编辑: @帕夫洛。事实上,这是一个错误。我使用的是JSX,例如,我想要7个div(未测试)

让cols=[];
对于(设i=0;i 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]


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

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

下面是一种使用生成器的方法:

function* square(n) {
    for (var i = 0; i < n; i++ ) yield i*i;
}
另一个想法是:

[...Array(5)].map((_, i) => i*i)
Array(5)
创建一个未填充的五元素数组。当给定一个参数时,
Array
就是这样工作的。我们使用扩展运算符创建一个包含五个未定义元素的数组。然后我们可以映射它。请参阅

或者,我们可以写作

Array.from(Array(5)).map((_, i) => i*i)
或者,我们可以利用
Array#from
的第二个参数跳过
map
并写入

Array.from(Array(5), (_, i) => i*i)
我最近看到的一个可怕的黑客,我不推荐你使用,就是

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

你想将每个数字1-7平方吗?在第一个例子中,你可能指的是
cols.push(i*i)
而不是
return i*i
@vihan1086:ES曾多次提出数组理解,但没有在规范中实现。
.map(i=>i*i)
被认为简单得多:-)这在我尝试时不起作用:array(7).keys().map(i=>i*i);keys()返回了一个迭代器。但是这是可行的:Array.from(Array(7).keys()).map(i=>i*i)注意需要显式地将迭代器加载到另一个数组中。@arceldon不,它不起作用。我不确定我发帖时的想法:p Will fixArray理解不是ES7的一部分。据我所知,这甚至不再是一个提议。至少不要声称他们在ES7中。这只会让人困惑。我认为Babel不再支持它们:.
Array(…Array(5))
更好地表达为
[…Array(5)]
。如果不需要map中的结果数组,并且您想在其中保留“for”字,您可以使用
Array(8).fill().forEach((uu,I)=>console.log(I))
[…Array(8)].forEach((ui)=>console.log(I))
请注意,除非将
未定义
作为第一个参数添加到
填充
,否则此代码在Typescript中将失败。根据Typescript的说法,维护人员似乎反对使用
数组.prototype.fill
。谢谢,Adam。出于实际目的,我已将答案更新为使用
.fill(0)
。对于我来说,这个答案帮助很大,谢谢。或者
Array.from({length:8},(\u,I)=>I*I)
[...Array(5)].map((_, i) => i*i)
Array.from(Array(5)).map((_, i) => i*i)
Array.from(Array(5), (_, i) => i*i)
[...1e4+''].map((_, i) => i*i)