如何使用 Ramda 从数组中获取偶数和奇数条目

JD.*_*JD. 4 javascript functional-programming ramda.js

我有以下几点:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

是否有一个与 IndexedList 等效的 Ramda,所以我可以拥有一个仅基于偶数索引的元素的数组和一个基于奇数的索引元素的数组。

Sco*_*yet 5

Ramda 基于列表的函数默认不处理索引。这部分是因为它们中的许多更通用,并且还可以与索引没有意义的其他数据结构一起使用。但对于改变功能,使他们通过你的列表的指数沿着标准的机制:addIndex

所以我对此的第一个想法是首先,将您的内容isEven扩展到

var indexEven = (val, idx) => isEven(idx);
Run Code Online (Sandbox Code Playgroud)

然后你可以使用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']
Run Code Online (Sandbox Code Playgroud)

或者如果你同时想要它们,你可以partition像这样使用它:

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

如果您愿意,您可以在Ramda REPL上看到它的实际效果。