我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
基于高票答案和高票评论。
const range = (from, to) => [...Array(to + 1).keys()].slice(from);
// usage
let test = [];
test = range(5, 10);
console.log(test); // output: [ 5, 6, 7, 8, 9, 10 ]
其他回答
空数组和数组中只有数字的解决方案
const arrayOne=新数组(10);console.log(arrayOne);const arrayTwo=[…数组(10).keys()];console.log(arrayTwo);var arrayThree=Array.from(Array(10).keys());console.log(arrayThree);const arrayStartWithOne=Array.from(Array(10).keys(),item=>item+1);console.log(arrayStartWithOne)
ES6中还有另一种方法,使用Array.from,它接受两个参数,第一个是arrayLike(在本例中是具有长度属性的对象),第二个是映射函数(在本示例中,我们将项映射到其索引)
Array.from({length:10}, (v,i) => i)
它更短,可用于生成偶数等其他序列
Array.from({length:10}, (v,i) => i*2)
此外,这比大多数其他方式具有更好的性能,因为它只在阵列中循环一次。查看截图以进行一些比较
//打开开发控制台以查看结果计数=100000console.time(“来自对象”)for(设i=0;i<count;i++){range=Array.from({length:10},(v,i)=>i)}console.timeEnd(“来自对象”)console.time(“来自按键”)for(设i=0;i<count;i++){range=Array.from(Array(10).keys())}console.timeEnd(“来自按键”)console.time(“应用”)for(设i=0;i<count;i++){range=Array.apply(null,{length:10}).map(函数(元素,索引){return index;})}console.timeEnd(“应用”)
对我来说,这是更有用的实用程序:
/**
* create an array filled with integer numbers from base to length
* @param {number} from
* @param {number} to
* @param {number} increment
* @param {Array} exclude
* @return {Array}
*/
export const count = (from = 0, to = 1, increment = 1, exclude = []) => {
const array = [];
for (let i = from; i <= to; i += increment) !exclude.includes(i) && array.push(i);
return array;
};
简单量程发生器:
const min = 2000;
const max = 2022;
const range = Array.from({ length: max - min + 1 }, (v, k) => k + min);
console.log('range', range);
试试看:
var foo = [1, 2, 3, 4, 5];
如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:
var foo = [1..5];
否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。