underscorejs
Underscore是一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并希望立即开始工作, 我需要什么?“...它弥补了部分jQuery没有实现的功能,同时又是Backbone.js必不可少的部分。
Underscore提供了100多个函数,包括常用的: map, filter, invoke — 当然还有更多专业的辅助函数,如:函数绑定, 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: inject, foldl
别名为 inject 和 foldl, reduce方法把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/