将_.filter和_.reject作为单个操作运行,如Haskell的Data.List.Partition

时间:2014-09-23 05:24:33

标签: underscore.js filtering lodash

我想根据谓词是返回true还是false来将JavaScript数组中的值分成两个单独的数组。这可以通过使用Underscore或Lo-Dash的两个操作轻松完成:

var values = [1, 2, 3, 4];
var even = function (num) { return num % 2 === 0; };
var evens = _.filter(values, even);
var odds = _.reject(values, even);

这将在每个值上运行谓词两次,这在这里是正常的,但如果values被更大的数据集替换,并且even被替换为计算成本更高,则可能会出现问题谓词。

我查看了Lo-Dash的文档,但在单个操作中看不到任何可以执行此操作的内容。我可以手动编写这样的功能,但这似乎是一个奇怪的遗漏。是否有这样的功能让我失踪?

1 个答案:

答案 0 :(得分:5)

下划线有_.partition

  

分区 _.partition(array, predicate)

     

数组拆分为两个数组:一个元素的所有元素都满足谓词,另一个元素的元素都不满足谓词

但似乎Lo-Dash没有(还)拥有它。您可以改为使用groupBy

var partition = _.groupBy(values, function(num) { return num % 2 === 0 });

然后自己从partition对象中拉出两块;我认为这仍然是两个步骤,但只能通过values。当然,这将对布尔键进行字符串化,但这不应该是一个问题。