为什么 underscore 的 _.each 与 _.map 不同?

发布于 2022-09-03 08:20:24 字数 1748 浏览 15 评论 0

刚开始看 underscore 的源码,看到 _.each 与 _.map 的实现,这两个函数的区别是是否返回一个对传入的类数组的每个元素进行操作并将结果保持在新数组中返回。

在 underscore 中的 _.each 与 _.map:

_.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;
  };

_.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;
  };

为什么在 _.each 不与 _.map 中相同的使用:

for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      results[index] = iteratee(obj[currentKey], currentKey, obj);
    }

而是使用 if...else... 结构?

为什么不这样写?

_.each = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
        
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      iteratee(obj[currentKey], currentKey, obj);
    }
  };

是因为传入 _.each 中的类数组频率高于传入对象吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凝望流年 2022-09-10 08:20:24

个人理解

两个函数的核心区别是 是否返回结果。
代码中的核心区别 就体现在在了 results上。
出于性能考虑 , 创建定长的数组 比 想数组中逐个追加元素的 速度快。
历次类推 results _> len _> keys
既然keys已经可知了, 统一一个循环处理keys数组就可以了。 至于每次三目运算符的性能损耗忽略不计吧, 很低很低。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文