Javascript 迭代范围的函数方式(ES6/7)
以更实用的方式(使用ES6/ES7)执行以下操作的最佳方法是什么 但这意味着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).
[].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)