2017-05-15 80 views
0

我正在開發一個解決方案,我需要通過兩個單獨的連續號碼範圍進行循環。比方說,例如1至5和10至15在javascript上循環遍歷2個數字範圍

我用下面的代碼:

var X = []; 

for (i = 1; i < 6; i++) { 
    X.push(i); 
} 
for (i = 10; i < 16; i++) { 
    X.push(i); 
} 

for (var x in X) {  
    console.log(parseInt(X[x])); 
} 

此代碼的工作,但有很多的開銷和不必要的操作:

  • 花費時間填充期望的範圍
  • 由指數爲獲得真值訪問元素數組(X [X])
  • 轉換值回使用參數爲整數seInt(作爲類型X [X]是字符串)

是否有執行這種操作的任何簡單/更高效的方法? 事情是這樣的:

for(x = 1 to 5, then x = 10 to 15) { 
    // do something with x 
} 

約束:如反覆進行該 環的多個位置上的代碼

  • 使用兩個單獨的循環使用相同的代碼裏面是沒有用的
  • 將函數內容封裝在函數中是不理想的
  • 檢查x bou ndaries和更新循環的內部它的價值也是不希望(我的意思是,檢查如果x == 5,然後將其更改爲10)

我已經經歷了這麼搜查,但沒有找到這方面的任何解決方案。

在此先感謝!

+0

什麼期望了它:

沿東西下面的代碼行? – ochi

+0

如何返回一個靜態數組函數 - 函數do(){return [1,2,3,4,5,10,11,12,13,14,15]; } – user2182349

+1

代碼中的'parseInt'不是必需的。 'X [x]'已經是一個整數。它是一個字符串'x'。此外,[不要使用'for ... in'循環遍歷數組](http://stackoverflow.com/q/500504/5743988)。 – 4castle

回答

2

這不一定更高效,但它確實保持了一切又好又整齊,並防止重複代碼。

基本上,編寫一個函數,該函數接受範圍數組和一個回調,以在指定範圍內的循環的每次迭代中執行。

如果需要,範圍和當前索引傳遞給回調函數。

function loop(ranges, callback) { 
    ranges.forEach(function (range) { 
    for (var i = range[0]; i <= range[1]; i++) callback(range, i); 
    }); 
} 

var ranges = [ 
    [1, 5], 
    [10, 15], 
]; 

var callback = function (range, i) { 
    console.log(i); 
} 

loop(ranges, callback); 
+0

這似乎更好地匹配OP所要求的(比其他答案),因爲它不創建中間數組,然後迭代它,而只是迭代傳入的範圍。如果我需要這種功能,這就是我會寫的。 – jfriend00

+0

感謝大家的幫助。來自4castle,guest271314和fubar的大家提出的答案,他們都會按預期解決問題。這是我選擇的答案,因爲考慮到我在尋找什麼,它是「更清潔」的方法,並且在測試[這裏](https://jsperf.com/loop-range-original/)時也有最佳性能。 – GCSDC

+0

@GCSDC鏈接到的JSPerf在速度上沒有顯着差異。它們都在0.01 op/sec之內。 – 4castle

2

在ES6你可以創建一些generator functions它抽象掉的細節循環,並使用for...of循環。這樣你就可以得到你想要的可讀語法,而不會創建任何大型數組。

function* ranges(...rangeDescriptors) { 
 
    for (const [min, max, step = 1] of rangeDescriptors) 
 
    for (let i = min; i < max; i += step) 
 
     yield i; 
 
} 
 

 
for (const x of ranges([1, 6], [10, 16])) { 
 
    console.log(x); 
 
}

5

您可以使用for..of循環,for循環,傳播元素

let res = []; 
 

 
for (let [from, to] of [[1, 6], [10, 16]]) 
 
    for (let x = from; x < to; x++) console.log(x); res.push(x); 
 

 
console.log(res);

如果要求是隻記錄數字在console,或「/ /做些什麼X」而不存儲的結果‘陣列中的東西’,我們可以減少javascript

for (let [from, to] of [[1, 6], [10, 16]]) 
 
    for (let x = from; x < to; x++) console.log(x); // do stuff with `x`

+1

它是隻是我還是JavaScript看起來越來越不像舊的JavaScript:p我喜歡這種類型的代碼:p –

+1

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/ 144295 /討論-4castle和 - guest271314間)。 – 4castle

0

我只是要清楚你要添加到您的陣列和範圍是什麼。你不是說

var startAt = 1; 
 
var midStop = 6; 
 
var highStop = 16; 
 
var stopAt = 20; 
 

 
var X = []; 
 

 
for (i = startAt; i < stopAt; i++) { 
 
    if (i < midStop || i > highStop) { 
 
    X.push(i); 
 
    } 
 
} 
 

 
var j = startAt; 
 

 
X.forEach(function(x) { 
 
    console.log("[" + j++ + "]:" + x); 
 
});