var data = [...Array(10).keys()];
console.log(data);
var data1 = Array(8).fill().map((_, i) => i);
console.log(data1);
data1显示[0,1,...,7]但是数据只显示[[object Array Iterator]]我如何实际看到这些数字。
我需要对数字进行一些迭代(Euler项目的一部分)。
以前我在Python中做过很多Euler挑战。现在我决定重新访问它并尽可能多地使用JS(尽可能多的ES6语法)来帮助我提高我的js技能。
答案 0 :(得分:57)
这是一个在codepen中运行的简单解决方案:
Array.from(Array(10).keys())
要明确,Array.from()
和Array.keys()
需要ES6 polyfill才能在所有浏览器中使用。
答案 1 :(得分:27)
参观Array.from实际案例
Array.from
也接受第二个参数,用作映射函数
let out = Array.from(Array(10), (_,x) => x);
console.log(out);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
很高兴知道,因为您可能希望生成有时比0
通过N
更复杂的数组。
const sq = x => x * x;
let out = Array.from(Array(10), (_,x) => sq(x));
console.log(out);
// [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
或者你也可以用生成器制作数组
function* range(start, end, step) {
while (start < end) {
yield start;
start += step;
}
}
let out = Array.from(range(10,20,2));
console.log(out); // [10, 12, 14, 16, 18]
Array.from
非常强大。人们甚至没有意识到它的全部潜力。
const ord = x => x.charCodeAt(0);
const dec2hex = x => `0${x.toString(16)}`.substr(-2);
// common noob code
{
let input = "hello world";
let output = input.split('').map(x => dec2hex(ord(x)));
console.log(output);
// ["68", "65", "6c", "6c", "6f", "20", "77", "6f", "72", "6c", "64"]
}
// Array.from
{
let input = "hello world";
let output = Array.from(input, x => dec2hex(ord(x)));
console.log(output);
// ["68", "65", "6c", "6c", "6f", "20", "77", "6f", "72", "6c", "64"]
}
答案 2 :(得分:21)
似乎问题是codepen使用babel es2015-loose编译你的代码。
在该模式下,您的
[...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()));
会按照需要行事。
有关模式的详情,请参阅②ality - Babel 6: loose mode。
答案 3 :(得分:8)
这里的所有其他答案都创建了一个临时的中间数组,这是不必要的。
Array.from({ length: 10 }, (_, i) => i)
这实际上是一个地图功能,您可以从数组索引映射到任何您喜欢的任何元素。
答案 4 :(得分:4)
进一步细化,生成一个值从1开始的数组:
Array.from(Array(10).keys(), n => n + 1)
答案 5 :(得分:3)
这是一个range
函数,它接受start
,end
和一个step
参数。它返回一个从start
开始到(但不包括)end
数字的数组,其大小为step
。
const range = (start, end, step) => {
return Array.from(Array.from(Array(Math.ceil((end-start)/step)).keys()), x => start+ x*step);
}
console.log(range(1, 10, 1));
//[1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(range(0, 9, 3));
//[0, 3, 6]
console.log(range(10, 30, 5));
//[10, 15, 20, 25]
如果您还希望包含end
的范围,请更进一步。
const inclusiveRange = (start, end, step) => {
return Array.from(Array.from(Array(Math.ceil((end-start+1)/step)).keys()), x => start+ x*step);
}
console.log(inclusiveRange(1, 10, 1));
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(inclusiveRange(0, 9, 3));
// [0, 3, 6, 9]
console.log(inclusiveRange(10, 30, 5));
//[10, 15, 20, 25, 30]