javascript - underscore的each和map处理iteratee为何不同?

查看:101
本文介绍了javascript - underscore的each和map处理iteratee为何不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

相关源码如下:

_.each = _.forEach = function(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

  // Return the results of applying the iteratee to each element.
  _.map = _.collect = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
      length = (keys || obj).length,
      results = Array(length);
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }
    return results;
  };

两个函数体中第一行分别为

iteratee = optimizeCb(iteratee, context);

iteratee = cb(iteratee, context);

这里是有什么用意么,小的想了很久~感觉要是我的话会统一用

iteratee = optimizeCb(iteratee, context);

不晓得为何要用不一样的写法。

解决方案

核心原因就是map要返回一个新数组, 所以针对这一点要做更多的判断, 比如缺省iteratee, iteratee如果是个object怎么办, 是个数组怎么办... 如果overwrite了内置的_.iteratee怎么办..等等

正常来说, 如果iteratee是个function, 而且_.iteratee没有被覆盖的话, 和使用 optimizeCb是一样的.

  var cb = function(value, context, argCount) {
    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
    if (value == null) return _.identity;
    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
    return _.property(value);
  };

这篇关于javascript - underscore的each和map处理iteratee为何不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆