2016-10-13 41 views
2

我試圖實現一個函數,該函數接受三個參數(min,max,step),並使用該步驟生成從最小到最大的整數範圍。第一個整數是最小值,第二個是範圍的最大值,第三個是步長。接合方法不從數組中刪除項目

下面是一個應該看起來像這樣的示例: generateRange(2,10,2)應該返回[2,4,6,8,10]的數組。

我使用拼接方法刪除數組中大於max參數的任何現有元素。

function generateRange(min, max, step) { 
 
    var arr = []; 
 
    var count = min; 
 
    for (var i = 0; i < max/step; i++) { 
 
    arr[i] = count; 
 
    count = count + step; 
 
    arr[i] > max ? arr.splice(i, 1) : arr[i]; 
 
    } 
 
    return arr; 
 
} 
 

 
console.log(generateRange(2, 10, 2));

每當我console.log我的結果我得到了一堆逗號的最後一個項目之後...所以它看起來是這樣的:2,4,6,8,10,,, ,]

它似乎沒有刪除項目。我錯過了什麼?謝謝!

+1

當我運行代碼時,一切都正常工作:[2,4,6,8,10] – Marcin

+1

爲什麼不直接增加(max-max%step)/ step而不是拼接廢話 –

+1

[看起來對我來說很好。](https://jsfiddle.net/u3bsax5j/) –

回答

2

三元運算符有點奇怪,因爲表達式沒有存儲。它通過刪除太大的值來修復數組。這有效一次,但如果第二次,將增加,並通過分配arr [i],數組的長度再次好像沒有splice之前執行(除了未定義值在該i-1索引)。

最好在之前退出循環,然後分配一個超出範圍的值。在這種情況下繼續循環是沒有意義的。

所以使count變量的循環變量和條件:

function generateRange(min, max, step){ 
 
    var arr = []; 
 
    for(var count = min; count <= max; count+=step){ 
 
     arr.push(count); 
 
    } 
 
    return arr; 
 
} 
 

 
var res = generateRange(2, 10, 2); 
 

 
console.log(res);

一個不太可讀,但較短的ES6版本將是:

function generateRange(min, max, step){ 
 
    return Array.from(Array(Math.floor((max-min)/step)+1), (x,i) => min+i*step); 
 
} 
 

 
let res = generateRange(2, 10, 2); 
 

 
console.log(res);