博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【理解Underscore和Lo-Dash】Collections _.each
阅读量:6652 次
发布时间:2019-06-25

本文共 2587 字,大约阅读时间需要 8 分钟。

_.each

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

API

Lo-Dash

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

Aliases

each

Arguments

  1. collection (Array|Object|String): 要遍历的集合
  2. [callback=identity] (Function): 每次迭代中调用的函数
  3. [thisArg] (任意): 绑定到callbackthis
  4. callback接受三个参数: (value, index|key, collection)

Returns

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

Underscore

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

Aliases

forEach

Arguments

  1. list (Array|Object|String): 要遍历的集合
  2. iterator (Function): 每次迭代中调用的函数
  3. [context] (任意): 绑定到callbackthis
  4. 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

12345678
_.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

1234
_.each([1, 2, 3], alert);// => alert每个数字_.each({one : 1, two : 2, three : 3}, alert);// => alert每个数字value(不保证按照定义的顺序执行)

Source

Lo-Dash

12345678910111213141516
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

12345678910111213141516
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.cnblogs.com/betarabbit/archive/2013/05/31/3109525.html

你可能感兴趣的文章
二进制文件每两个的字节位置交换
查看>>
SQL Server 索引(index) 和 视图(view) 的简单介绍和操作
查看>>
Apache中使用mod_php的请求响应执行流程
查看>>
CentOS 6.3定制自动安装
查看>>
更改android源码并编译遇到的问题
查看>>
修正static控件配景色彩和文字色彩
查看>>
python 学习笔记 (核心)
查看>>
spring aop记录日志
查看>>
区块链实战超级账本视频教程|区块链视频教程
查看>>
还有人不认识通讯诈骗,短信验证码带你认识一下
查看>>
java博客集锦
查看>>
Docker(四)镜像创建
查看>>
unigui的UnimDatePicker控件使用经验
查看>>
C# 自定义堆栈进行回文检测的代码
查看>>
java为什么计算时间从1970年1月1日开始
查看>>
采用负责任的人工智能推动业务价值
查看>>
人工智能将是驱动未来城市发展的核心引擎
查看>>
网络下载图片大全
查看>>
比较实用的wamp配置多站点方法
查看>>
我的天!AI智能竟然能通过声音知道你的长相!
查看>>