繁体   English   中英

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

[英]How to get the even and odd entries from an array with 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所以我可以有一个只有基于偶数索引的元素和一个基于奇数的索引元素数组的数组。

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

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

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

然后你可以使用带filter addIndex并像这样reject

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上看到这个。

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

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

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

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

对于偶数:

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

对于奇数:

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

从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' ] ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM