pipe道过滤和lodash处理

我有以下lodash伪代码,这将处理auctions

 var auctions = [{'item': 12345, ...}, {'item': 12345, ...}, {'item':23436, ...}]; var process = function(auctions) { _(auctions) .groupBy('item') .thru(processSpecialItems) .each(processCommonItems) .value(); } 

每个函数都依赖于前一个函数的结果,但在processSpecialItemsprocessCommonItems的情况下:

  • 只有特定的item ,即。 由给定item值标识的组将由processSpecialItems处理。
  • 只有那些没有被处理的团体应该继续处理共同的processCommonItems
  • 这些操作是CPU密集型的,涉及数据库访问。

问题:

  • 我怎样才能过滤这些特殊的物品,处理它们,然后把剩下的东西还回来? 最好尽可能less的通过,因为data包含超过40,000个项目。
  • 使用同步迭代是否可接受,性能明智? 这段代码将被执行400次(全部在同一时间)。

假设您可以确定哪些项目组将由processSpecialItems处理,这可能是_.partition一项工作。

从文档 :

创build一个分成两组的元素数组,其中第一个包含谓词返回truthy的元素,第二个包含predicate返回falsey的元素。

_.partition(auctions, isSpecial)将返回[specialItems, commonItems] (其中specialItemscommonItems是适当的项目数组)。 然后你可以让processSpecialItems在第一个元素上运行,而processCommonItems在第二个元素上运行。

第一步不要分组项目,下一步

 var process = function(auctions) { return _(auctions) .partition(function(obj) { // use here partition condition, // which return true for special item, // something like return _.startsWith(obj.item, 's'); }) // you receive array of 2 arrays where // first array - array of special items // second array - array of common items .thru(function(array){ // process items return [ _.map(array[0], functionToProcessSpecialItem), _.map(array[1], functionToProcessCommonItem) ]; }) .flatten() // flat result .groupBy('item') // and group .value(); // you receive grouped and processed auctions }