管道过滤和使用lodash处理

时间:2015-08-28 16:04:55

标签: javascript node.js asynchronous 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密集型的,涉及数据库访问。

问题:

  • 如何过滤这些特殊物品,处理它们并返回其余物品?优选尽可能少的通过,因为data包含超过40,000项。
  • 使用同步迭代是否可接受,性能明智?此片段最多可执行400次(同时全部执行)。

2 个答案:

答案 0 :(得分:1)

假设您能够提前确定processSpecialItems将处理哪些项目组,这可能是_.partition的工作。

来自docs

  

创建一个分为两组的元素数组,第一组包含谓词返回truthy的元素,第二组包含谓词返回falsey的元素。

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

答案 1 :(得分:0)

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

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
}