underscorejs

分类:Javascript |

Underscore是一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“...它弥补了部分jQuery没有实现的功能,同时又是Backbone.js必不可少的部分。



Underscore提供了100多个函数,包括常用的: mapfilterinvoke — 当然还有更多专业的辅助函数,如:函数绑定, JavaScript模板功能,创建快速索引, 强类型相等测试, 等等.

为了你能仔细研读,这里包含了一个完整的测试套件

您也可以通过注释阅读源代码

享受Underscore,并希望获得更多的使用功能(感谢@Jaward华仔 的翻译建议),可以尝试使用Underscore-contrib(愚人码头注:Underscore-contrib是一个Underscore的代码贡献库)。

该项目代码托管在GitHub上。您可以在issues 页面上报告错误或讨论功能,或在 Gitter 通道中和我们聊。

Underscore是DocumentCloud的一个开源组件。



下载 (右键另存为)

开发版 (1.9.·)60kb, 未压缩版, 含大量注释
生产版 (1.9.1)6.5kb, 最简化并用Gzip压缩  (Source Map)

不稳定版未发布版本, 当前开发中的 master 分支, 如果使用此版本, 风险自负


安装(Installation)

  • Node.js npm install underscore

  • Meteor.js meteor add underscore

  • Require.js require(["underscore"], ...

  • Bower bower install underscore

  • Component component install jashkenas/underscore

集合函数 (数组 或对象)

each_.each(list, iteratee, [context]) Alias: forEach
遍历list中的所有元素,按顺序用每个元素当做参数调用 iteratee 函数。如果传递了context参数,则把iteratee绑定到context对象上。每次调用iteratee都会传递三个参数:(element, index, list)。如果list是个JavaScript对象,iteratee的参数是 (value, key, list))。返回list以方便链式调用。

_.each([1, 2, 3], alert);
=> alerts each number in turn...
_.each({one: 1, two: 2, three: 3}, alert);
=> alerts each number value in turn...

注意:集合函数能在数组,对象,和类数组对象,比如arguments, NodeList和类似的数据类型上正常工作。 但是它通过鸭子类型工作,所以要避免传递带有一个数值类型 length 属性的对象。每个循环不能被破坏 - 打破, 使用_.find代替,这也是很好的注意。

map_.map(list, iteratee, [context]) Alias: collect
通过对 list 里的每个元素调用转换函数(iteratee迭代器)生成一个与之相对应的数组。iteratee传递三个参数:value,然后是迭代 index(或 key 愚人码头注:如果list是个JavaScript对象是,这个参数就是key),最后一个是引用指向整个list。

_.map([1, 2, 3], function(num){ return num * 3; });
=> [3, 6, 9]
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
_.map([[1, 2], [3, 4]], _.first);
=> [1, 3]

reduce_.reduce(list, iteratee, [memo], [context]) Aliases: injectfoldl
别名为 inject 和 foldlreduce方法把list中元素归结为一个单独的数值。Memo是reduce函数的初始值,会被每一次成功调用iteratee函数的返回值所取代 。这个迭代传递4个参数:memo,value 和 迭代的index(或者 key)和最后一个引用的整个 list。

如果没有memo传递给reduce的初始调用,iteratee不会被列表中的第一个元素调用。第一个元素将取代memo参数传递给列表中下一个元素调用的iteratee函数。

var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
=> 6

reduceRight_.reduceRight(list, iteratee, [memo], [context]) Alias: foldr
reducRight是从右侧开始组合元素的reduce函数, Foldr在 JavaScript 中不像其它有惰性求值的语言那么有用(愚人码头注:lazy evaluation:一种求值策略,只有当表达式的值真正需要时才对表达式进行计算)。

var list = [[0, 1], [2, 3], [4, 5]];
var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
=> [4, 5, 2, 3, 0, 1]

find_.find(list, predicate, [context]) Alias: detect
list中逐项查找,返回第一个通过predicate迭代函数真值检测的元素值,如果没有元素通过检测则返回 undefined。 如果找到匹配的元素,函数将立即返回,不会遍历整个list。 predicate 通过 iteratee 进行转换,以简化速记语法。

var even = _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> 2

filter_.filter(list, predicate, [context]) Alias: select
遍历list中的每个值,返回所有通过predicate真值检测的元素所组成的数组。 predicate 通过 iteratee 进行转换,以简化速记语法。

..................



from: https://underscorejs.net/

阅读( 53 ) |