我刚刚开始进行代码战挑战,其中之一是“生成整数范围”问题。我设法通过for循环解决了问题,但是我想知道是否可以在一行中解决这个问题?
我尝试将fill和map方法与while和do-while循环结合使用。问题是我无法获得返回数组中的第一个数字(开始时为min)。第一次while循环求值为true时,它返回以步长值递增的最小值。
function generateRange(min,max,step) {
return Array(Math.floor((max - min) / step ))
.fill()
.map(() => {while(min <= max) {return min+=step;}});
}
console.log(generateRange(0, 10, 2));
我期望从最小到最大的数字,并且步幅在其中。 min = 0,max = 10,step = 2,结果=> [0,2,4,6,8,10]但我得到的所有数字都没有第一个起始最小值[2,4,6,8,10]
答案 0 :(得分:4)
您可以将min
递减1,然后将该值用于进一步的映射。
function generateRange(min, max, step) {
return Array.from(
{ length: Math.floor((max - (min -= step)) / step) },
() => min += step
);
}
console.log(generateRange(0, 10, 2));
答案 1 :(得分:2)
靠近原始代码:
function generateRange(min,max,step) {
return Array(Math.floor((max - min + step) / step ))
.fill()
.map(() => {while(min <= max) {return (min+=step)-step;}});
}
console.log(generateRange(0, 10, 2));
答案 2 :(得分:1)
类似的东西应该可以工作:
function range(min,max,step = 1) {
return [...Array(Math.floor((max-min+step)/step)).keys()].map(x => x*step + min);
}
console.log(range(0,10,2))
console.log(range(2,5,1))
console.log(range(1,25,5))
console.log(range(0,100,10))
答案 3 :(得分:1)
function generateRange(min, max, step) {
return "0".repeat(Math.floor((max - min) / step) + 1).split("").map((x, i) => min + i * step);
}
console.log(generateRange(0, 10, 2));
答案 4 :(得分:1)
这应该起作用:
function generateRange(min,max,step) {
return Array.from(Array(((max - min) / step) + 1).keys()).map(el => (el * step) + min);
}
console.log(generateRange(20, 40, 2));
答案 5 :(得分:1)
我认为生成器函数对于这类事情非常有用。
您的问题要求单线执行,尽管我认为2函数看起来更好。这是因为您可以在不需要数组的其他地方使用生成器。
function* iter_generateRange(min,max,step) {
for (let l = min; l <= max; l += step) yield l;
}
function generateRange(...args) {
return Array.from(iter_generateRange(...args));
}
const generateRange1liner = (min, max, step) =>
[...(function* () {
for (let l = min; l <= max; l += step) yield l;
}())];
//use the generateRange that returns the array
console.log(JSON.stringify(generateRange(10, 20, 2)));
//we can use it here too..
for (const r of iter_generateRange(3, 9, 3)) console.log(r);
//and finally using the 1 liner version
console.log(JSON.stringify(generateRange1liner(10, 20, 2)));