“生成整数范围”一线解决方案

时间:2019-09-18 12:59:18

标签: javascript arrays

我刚刚开始进行代码战挑战,其中之一是“生成整数范围”问题。我设法通过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]

6 个答案:

答案 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)));