2014-02-24 96 views
0

我想要普通的香草解決方案。我寫的 for (var i = 0; i < someSize; i++) {...}「for(var i = 0; i <size; i ++)」循環有什麼可能的功能替換?

很多請注意,它不是遍歷數組或它的主要是純計算DOM節點。

我想更多的功能方法,因爲我是懶惰。例如: new Array(15).forEach(function(i, idx) { ... ... })

但這不起作用。

當使用underscore我以前寫 _.range(0,100,4).forEach(function(i, idx) { doSomethingWith(i); });

請不在於它可能是不切實際的,但我喜歡彎曲的JavaScript。

+1

可能的重複[對於數組中的每一個。如何在JavaScript中做到這一點?](http://stackoverflow.com/questions/9329446/for-each-in-an-array-how-to-do-that-in-javascript) – GSerg

+0

爲什麼組成一個數組只是遍歷一系列數字?爲什麼不只是做一個幫助函數來進行迭代(如我的答案)?我想我很困惑,爲什麼你認爲製作一個虛擬數組,以便可以迭代一系列數字就是期望的解決方案? – jfriend00

+0

你是對的,我正在創建一個虛擬數組,因爲'forEach'。它看起來像你的答案是最適合我的。 –

回答

2

不知道你真正想要的,但你可以有一個管理你的循環計數器一個通用的迭代函數:

function loop(start, stop, fn) { 
    for (var i = start; i < stop; i++) { 
     if (fn(i) === false) { 
      return; 
     } 
    } 
} 

然後,你可以使用這樣的:

loop(0, size, function(i) { 
    // use i here 
}); 

您甚至可以使起始值爲可選(如果不存在,則默認爲零):

function loop(start, stop, fn) { 
    if (!fn) { 
     fn = stop; 
     stop = start; 
     start = 0; 
    } 
    for (var i = start; i < stop; i++) { 
     if (fn(i) === false) { 
      return; 
     } 
    } 
} 

loop(size, function(i) { 
    // use i here 
}); 
+0

謝謝,我雖然沒有一個簡單的通用解決方案,並正在尋找一些'魔術'! :) –

2

這不起作用的原因似乎是因爲forEach未迭代使用類似數組構造函數時設置的undefined值。

forEach工作得很好,其實有內容,你會看到,當你像這樣運行代碼數組:

[1,2,3,4,5,6,7,8].forEach(function(){console.log(arguments)}); 

所以,現在,你會尋找將正確初始化新數組,包含內容。

This question on SO在這方面有一些有用的答案。
最短的解決方案似乎是:

new Array(5+1).join('0').split('') 

你可以簡單的鏈條後的forEach

或者,你可以在這個問題更upvoted答案之一掀起原型:

Array.prototype.init = function(value, length){ 
    return Array.apply(null, new Array(length)).map(function(){ 
     return value.valueOf(); 
    },value); 
} 

這允許你做這樣的事情:

[].init('foo', 3); 
// ["foo", "foo", "foo"] 
[].init(60, 4); 
// [60, 60, 60, 60] 
[].init({}, 3); 
// [{},{},{}] 
[].init(true, 9); 
// [true, true, true, true, true, true, true, true, true] 

當然你也可以在init()之後連鎖.forEach()

(實際上,如果您不將此函數添加到Array.prototype,則可以使用init(),而不使用數組文字。這可能是一種「更清潔」的解決方案)

+0

謝謝。至於'new Array(5).join('')。split('')。forEach()'這對我來說似乎是一種矯枉過正的行爲:) –

+0

@ lukas.pukenis:我同意:P對於我建議的原型怎麼樣?如果你使用它很多,這可能是值得的。 – Cerbrus

+0

我不介意把東西添加到'prototype'中,你的解決方案非常出色,也非常感謝! –

相關問題