2015-11-13 28 views
2

我有以下幾點:如何從一個數組得到偶數和奇數項與Ramda

var isEven = function (n) { return n % 2 === 0; } 
    var isOdd = function (n) { return n % 2 !== 0; } 

    var indexedList = function(fn, list) { 
     var array = []; 
     for (var i = 0; i < list.length; i++) { 
      if (fn(i)) { 
       array.push(list[i]); 
      } 
     } 

     return array; 
    } 

是否有Ramda相當於IndexedList,所以我可以只基於偶數的索引元素和數組基於奇數的索引元素的數組。

回答

4

Ramda的基於列表的函數默認不處理索引。這部分是因爲它們中的許多更通用,並且與索引無意義的其他數據結構一起工作。但是有一個標準的機制來修改函數,使它們確實可以傳遞你的列表的索引:addIndex

所以我對第一個念頭就是首先把你的isEven並將其擴展到

var indexEven = (val, idx) => isEven(idx); 

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

R.addIndex(R.filter)(indexEven, ['a', 'b', 'c', 'd', 'e']); 
//=> ['a', 'c', 'e'] 
R.addIndex(R.reject)(indexEven, ['a', 'b', 'c', 'd', 'e']); 
//=> ['b', 'd'] 

或者如果你同時需要它們,你可以使用partition像這樣:

R.addIndex(R.partition)(indexEven, ['a', 'b', 'c', 'd', 'e']); 
//=> [["a", "c", "e"], ["b", "d"]] 

如果您願意,您可以在Ramda REPL中看到此操作。

+0

非常感謝Scott,優秀的圖書館 –

+0

你應該注意到,如果你打算重用這些函數,你應該存儲一個類似'R.addIndex(R.filter)'的引用,而不是重新創建它每個電話。但這是一個小問題。 –