资讯专栏INFORMATION COLUMN

Underscore和Lo-Dash中的Collections _.each

weakish / 1339人阅读

摘要:遍历集合,对集合中的每个元素执行回调。因此,上面的判断等价于是预先定义的空对象,内部用于提前结束循环的标志,并没有对外公开。

_.each

遍历集合,对集合中的每个元素执行回调。

API Lo-Dash

_.forEach(collection [, callback=identity, thisArg])

Aliases

each

Arguments

collection (Array|Object|String): 要遍历的集合

[callback=identity] (Function): 每次迭代中调用的函数

[thisArg] (任意): 绑定到callbackthis

callback接受三个参数: (value, index|key, collection)

Returns

(Array, Object, String): 返回collection.

Underscore

_.each(list, iterator, [context])

Aliases

forEach

Arguments

list (Array|Object|String): 要遍历的集合

iterator (Function): 每次迭代中调用的函数

[context] (任意): 绑定到callbackthis

iterator接受三个参数: (element|value, index|key, list)

Returns

(Array, Object, String): 返回undefined.

Note

Lo-Dash可以省略回调函数,而Underscore则必须传入

Lo-Dash可以通过在回调中返回false提前结束迭代

Lo-Dash会返回Collection从而允许链式操作,Underscore的返回值则是undefined

Example Lo-Dash
_.forEach([1,2,3])
// => 返回[1,2,3]

_([1, 2, 3]).forEach(alert).join(",");
// => alert每个数字并返回"1,2,3"

_.forEach({ "one": 1, "two": 2, "three": 3 }, alert);
// => alert每个数字value(不保证按照定义的顺序执行)
Underscore
_.each([1, 2, 3], alert);
// => alert每个数字
_.each({one : 1, two : 2, three : 3}, alert);
// => alert每个数字value(不保证按照定义的顺序执行)
Source Lo-Dash
function forEach(collection, callback, thisArg) {
    var index = -1,
    length = collection ? collection.length : 0;

    callback = callback && typeof thisArg == "undefined" ? callback : lodash.createCallback(callback, thisArg);
    if (typeof length == "number") {
        while (++index < length) {
            if (callback(collection[index], index, collection) === false) {
                break;
            }
        }
    } else {
        forOwn(collection, callback);
    }
    return collection;
}
Underscore
var each = _.each = _.forEach = function(obj, iterator, context) {
    if (obj == null) return;
    if (nativeForEach && obj.forEach === nativeForEach) {
      obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
      for (var i = 0, l = obj.length; i < l; i++) {
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
      }
    } else {
      for (var key in obj) {
        if (_.has(obj, key)) {
          if (iterator.call(context, obj[key], key, obj) === breaker) return;
        }
      }
    }
  };
Additional

obj.length === +obj.length
+obj: 将obj转换成10进制数,否则返回NaN。因此,上面的判断等价于obj.length && typeof obj.length == "number"

if (iterator.call(context, obj[i], i, obj) === breaker) return;
breaker是预先定义的空对象({}),Underscore内部用于提前结束循环的标志,并没有对外公开。另外,因为对象的===比较的是对象地址,所以就算用户在自己的iterator中返回{},上述if仍然不成立

for in循环不会遍历non-enumerable属性,因此像ObjecttoString等就不会被迭代

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78555.html

相关文章

  • underscore函数

    摘要:提供如下函数,很是方便提供了常用的函數。建議使用,性能優異很多的實現。補充了缺少的對字符串的操作,不過有些其實原生就帶了。與配合使用無壓力。其他語言被移植到了其他語言,例如和。 underscore提供如下函数,很是方便: Underscore 提供了常用的函數。 Collections each map reduce reduceRight find filter whe...

    DevYK 评论0 收藏0
  • Lo-Dashunderscore,Prototype 与 jQuery,两段恩怨情仇

    摘要:一场恩怨,一段纷争,一段历史。后来崛起,并内置了库,从此一炮而红。可见,前端大战以的完胜而告终。无疑,在目前浏览器不完全兼容的情况下,提供的是操作的最佳选择。然而社区的意见偏向于,是唯一选择。的贡献者认为,现状不会改变。 这几天更新我的之前写的 Chrome 插件 ChromeSnifferPlus 可以探测正在使用的开源软件或者 js 类库,两天的时间增加了 20 多个 js 库的检...

    evin2016 评论0 收藏0
  • Lo-Dash 替换 underscore

    摘要:我用替换已经有一段时间了。更快,支持,并且拥有所缺乏的特性。这真是太棒了同样声称类似,但是使用惰性求值,并发布了一些令人印象深刻的速度比较。如果你使用,不管在哪里使用包括,你应该花上几分钟切换到。 我用Lo-Dash替换Underscore已经有一段时间了。Lo-Dash更快,支持AMD,并且拥有Underscore所缺乏的特性。同时,Lo-Dash和Underscore是100%兼容...

    RyanQ 评论0 收藏0
  • 兼容多种模块规范(AMD,CMD,Node)的代码

    摘要:主要区别是需要在声明模块时指定所有的依赖,通过形参传递依赖到模块内容中。 前言 昨天,公司同事问了我如下一个问题: showImg(https://segmentfault.com/img/bVWXYP?w=548&h=346); 说他在看一个插件时,看到了源码结构如截图所示,他知道(function(){})()是一种立即执行函数,但是在截图中,最后的那个圆括号里又写了一个函数fun...

    Shonim 评论0 收藏0
  • underscore.php

    摘要:是前端常用的库,最近无意中发现原来它还有的移植。基本介绍绝大部分函数都移植过来了。用的是,可是这个在中已经用来表示了,所以改成了,双下划线。函数一览绝大部分都移植过来了我自己更习惯写原生。 underscore是前端常用的javascript库,最近无意中发现原来它还有PHP的移植。 基本介绍 绝大部分函数都移植过来了。underscore.js用的是_,可是这个在PHP中已经用来...

    winterdawn 评论0 收藏0

发表评论

0条评论

weakish

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<