Javascript ES6-生成一个数字数组
通过谷歌搜索,我找到了两种解决方案:Javascript ES6-生成一个数字数组,javascript,ecmascript-6,Javascript,Ecmascript 6,通过谷歌搜索,我找到了两种解决方案: var data=[…数组(10).keys(); 控制台日志(数据); var data1=Array(8).fill().map((_,i)=>i); console.log(data1)以下是一个在codepen中工作的简单解决方案: Array.from(Array(10).keys()) 需要明确的是,Array.from()和Array.keys()需要ES6 polyfill才能在所有浏览器中工作。问题似乎在于codepen使用babel
var data=[…数组(10).keys();
控制台日志(数据);
var data1=Array(8).fill().map((_,i)=>i);
console.log(data1)代码>以下是一个在codepen中工作的简单解决方案:
Array.from(Array(10).keys())
需要明确的是,Array.from()
和Array.keys()
需要ES6 polyfill才能在所有浏览器中工作。问题似乎在于codepen使用babel es2015 lose预编译代码
在这种模式下,您的
[...Array(10).keys()];
变成
[].concat(Array(10).keys());
这就是为什么你会看到一个包含迭代器的数组
使用es2015模式,您将获得
function _toConsumableArray(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
} else {
return Array.from(arr);
}
}
[].concat(_toConsumableArray(Array(10).keys()));
function\u to consumablearray(arr){
if(数组isArray(arr)){
对于(变量i=0,arr2=Array(arr.length);i
这将按照期望的方式运行
有关模式的更多信息,请参阅。通过实际示例浏览Array.from
Array.from
还接受用作映射函数的第二个参数
let out=Array.from(数组(10),(x)=>x);
控制台。注销;
//[0,1,2,3,4,5,6,7,8,9]
进一步细化,生成一个值从1开始的数组:
Array.from(Array(10).keys(), n => n + 1)
这里的所有其他答案都会创建一个临时的中间数组,这是不必要的
Array.from({ length: 10 }, (_, i) => i)
这本质上是一个映射函数,您可以从数组索引映射到任意数量的元素。这里有一个范围
函数,它采用开始
,结束
,以及步骤
参数。它返回一个数组,从开始
到结束
编号(但不包括该编号),增量为步长
const range=(开始、结束、步骤)=>{
返回Array.from(Array.from(Array(Math.ceil((end-start)/step)).keys()),x=>start+x*step);
}
日志(范围(1,10,1));
//[1, 2, 3, 4, 5, 6, 7, 8, 9]
log(范围(0,9,3));
//[0, 3, 6]
日志(范围(10,30,5));
//[10,15,20,25]
如果我运行var data=[…数组(10).keys()]代码>在我的浏览器(最新稳定的Chrome)中,我看到列出的数字。如果我只做Array(10).keys()
,我会看到ArrayIterator
。这和codepen有关吗@它与巴别塔有关,巴别塔在特定的代码库中使用,它与CodePen对巴别塔的使用有关。我不确定他们运行的是什么版本,但如果你禁用Babel预处理器,一切都会正常。您可以运行此代码,但仍然可以看到预期的结果。谢谢。ES6功能不需要babel吗?那“noob代码”有什么错?我认为它更具可读性。这是迄今为止最优雅的方法,也可能是使用具有长度属性的对象作为iterable和集成在同一个“循环”中的map fn最有效的方法