在underscore集合相关方法中,我觉得写得最好的就是就是聚合相关的,这一部分包括三个方法:groupBy、indexBy、countBy。然而重点并不是这三个方法本身,而是生成这三个函数的高阶函数group。

group

如果自己实现上面提到的三个方法,似乎没什么特别的难度,groupBy是遍历根据iteratee返回的key聚合,indexBy是遍历按照iteratee返回的key重新组织数据,countBy是遍历根据iteratee返回的key计数。这三者的关联都是遍历根据iteratee返回的key做事情,而三者所做的具体事情又不一样。

var group = function(behavior) {
    return function(obj, iteratee, context) {
        var result = {};
        iteratee = cb(iteratee, context);
        _.each(obj, function(value, index) {
            var key = iteratee(value, index, obj);
            behavior(result, value, key);
        });
        return result;
    };
};

group方法就把三者不同点当成一个参数behavior,由外部传入,而遍历和通过iteratee获取key这种共同点统一处理。

在underscore中高阶函数大量运用,这一点很值得我们去学习。

groupBy indexBy countBy

// 根据key聚合
_.groupBy = group(function(result, value, key) {
    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
});

// 根据key重新组织
_.indexBy = group(function(result, value, key) {
    result[key] = value;
});

// 根据key计数
_.countBy = group(function(result, value, key) {
    if (_.has(result, key)) result[key]++; else result[key] = 1;
});

results matching ""

    No results matching ""