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

时间:2015-11-13 22:16:16

标签: 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;
    }

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

3 个答案:

答案 0 :(得分:4)

默认情况下,Ramda的基于列表的函数不处理索引。这部分是因为它们中的许多都更通用,并且还与其他数据结构一起工作,其中索引没有意义。但是有一种改变函数的标准机制,以便它们确实传递列表的索引:addIndex

所以我首先想到的是首先,把你的isEven扩展到

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

然后您可以addIndexfilterreject一样使用{/ p>}:

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 上查看此操作。

答案 1 :(得分:0)

如果列表长度是偶数,我会同意

R.pluck(0, R.splitEvery(2, ['a','b','c']))

这样做的缺点是,当列表长度为奇数并且我们要选择偏移量为1(R.pluck(1)的时候,它将给undefined作为最后一个元素。优点是您可以轻松地在偏移量为

如果您不能忍受这个undefined,那么我发现还有另一种解决方案比可接受的答案更令人满意,因为它不需要定义自定义函数。但是,它不能很好地进行分区,就像公认的答案一样。

甚至:

R.chain(R.head, R.splitEvery(2, ['a','b','c','d']))

奇怪:

R.chain(R.last, R.splitEvery(2, ['a','b','c','d']))

答案 2 :(得分:0)

从Ramda 0.25.0开始,接受的解决方案将不起作用。使用这个:

const splitEvenOdd = R.compose(R.values, R.addIndex(R.groupBy)((val,idx) => idx % 2))

splitEvenOdd(['a','b','c','d','e'])
// => [ [ 'a', 'c', 'e' ], [ 'b', 'd' ] ]