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

问题描述 投票:3回答:3

我有以下内容:

    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所以我可以有一个只有基于偶数索引的元素和一个基于奇数的索引元素数组的数组。

javascript functional-programming ramda.js
3个回答
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']

或者如果你想同时使用它们,你可以像qzxswpoi一样使用它:

partition

如果你愿意,你可以在R.addIndex(R.partition)(indexEven, ['a', 'b', 'c', 'd', 'e']); //=> [["a", "c", "e"], ["b", "d"]] 上看到这个。


0
投票

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

Ramda REPL

这样做的缺点是,当列表长度为奇数并且我们想要选择偏移量1(R.pluck(0, R.splitEvery(2, ['a','b','c'])))时,它将undefined作为最后一个元素。优点是您可以轻松选择每个具有任何偏移的第n个,而偏移<n。

如果你不能忍受这个R.pluck(1),那么我发现其他解决方案比接受的答案更令人满意,因为它不需要定义自定义函数。然而,正如公认的答案所做的那样,它不会很好地划分它。

对于偶数:

undefined

对于奇数:

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


0
投票

从Ramda 0.25.0开始,接受的解决方案将无效。用这个:

R.chain(R.last, R.splitEvery(2, ['a','b','c','d']))
© www.soinside.com 2019 - 2024. All rights reserved.