2016-04-22 60 views
1

在Ruby中,有一種方法叫做Enumerable#cycle,它允許在一個集合中重複多次循環x次。我正在尋找類似JavaScript的東西,但找不到相應的東西。與Ruby的Enumerable#循環等價的JavaScript是什麼?

有誰知道JavaScript的等價於Ruby的Enumerable#cycle?

上下文︰我試圖在JavaScript中循環相同的數組 - 兩次。一旦迭代達到最後,我想迭代從數組的開始處開始並最終停止。停止部分並不難 - 這是我試圖在JavaScript中實現的迭代循環。然而,我已經能夠在Ruby中做到這一點。

+0

實現你自己並不難。 Ruby有非常豐富的stdlib,所以我不希望每種方法的等價物都存在於JS-land中。即使lodash和下劃線似乎也沒有。 –

回答

1

我認爲沒有什麼內在的,相當於這一點,但如果需要,你可以按照這個職位更多詳細信息:

Javascript call a function several times with the arguments

除了提供有選項,你還可以擴展Array.prototype啓用此方法:

Array.prototype.cycle = function (n, callback) { 
    for (var i = 0; i < n; i++) { 
     this.forEach(callback); 
    } 
} 

,並可以使用此類似以下內容:

a = [1, 2, 3, 4] 
a.cycle(2, function (i) { console.log(i); }); 
// this will print all the values two times 
1

沒有內置的JavaScript (或者甚至提出,據我所知)可以做到這一點。但是,完成自己並不難。

假設爲你談論陣列一分鐘,讓我們放棄掉有關修改原型或不討論。你想要的簡單版本可能是:

Array.prototype.cycle = function(cycleCount, callback) { 
    for(var i = 0; i < cycleCount; i++) { 
    this = this.map(callback); 
    } 
} 

讓我們假設你有一個數組數組。然後,你可以這樣做稱之爲:

myNumberArray.cycle(2, function(num, i) { 
    return num * 2; 
}); 

我們甚至可以得到看中,並讓你指定每個週期不同的動作:

Array.prototype.cycle = function(cycleCount, callback) { 
    if(Object.prototype.toString.call(callback) === '[object Array]') { 
    if(callback.length === cycleCount) { 
     for(var i = 0; i < cycleCount; i++) { 
     this = this.map(callback[i]); 
     } 
    } else { 
     // Uhoh, we don't have the right number of callbacks 
     throw new Error('If using multiple callbacks, the umber of callback\'s must match the number of cycles'); 
    } 
    } else { 
    for(var i = 0; i < cycleCount; i++) { 
     this = this.map(callback); 
    } 
    } 
} 

還有更多的錯誤檢查,你需要做的讓這個強大,但你明白了。 :)

+0

在向原型添加方法之前添加一個檢查是很有用的:'if(!('Array.prototype'中的'cycle'){...' – Andy

相關問題