你还在为JavaScript中的数据转换、匹配、查找等烦恼吗?一堆看似简单的foreach,却冗长无趣,可仍还在不停的repeat it!也许你已经用上了Underscore.js,不错,你已经进步很大一步了。然而今天我但愿你能更进一步,利用lodash替换掉Underscore。html
lodash一开始是Underscore.js库的一个fork,由于和其余(Underscore.js的)贡献者意见相左。John-David Dalton的最初目标,是提供更多“一致的跨浏览器行为……,并改善性能”。以后,该项目在现有成功的基础之上取得了更大的成果。最近lodash也发布了3.5版,成为了npm包仓库中依赖最多的库。它正在摆脱屌丝身份,成为开发者的常规的选择之一。npm
如今咱们所熟知的不少开源项目都已经使用或者转到了lodash阵营之上。好比JavaScript转译器Babel、博客平台Ghost,和项目脚手架工具Yeoman。特别Ghost是从Underscore迁移到了lodash,Ghost的创始人John O’Nolan对于此曾评价到:“这是一个很是明智的选择,它几乎彻底是由咱们开源开发社区推进的。咱们发现lodash包含更多的功能,更好的性能、恰到好处地使用了semver,而且在Node.js社区(以及其余依赖)中愈来愈抢眼“。数组
lodash演练
lodash主要使用了延迟计算,使得lodash其性能远远超过Underscore。在lodash中延迟计算意味着在咱们的链式方法在显示或隐式的value()调用以前是不会执行的。因为这种执行的延后,所以lodash能够进行shortcut fusion这样的优化,经过合并链式iteratee大大下降迭代的次数。从而大大提供其执行性能。浏览器
百说不如一练,下面咱们以用户信息为例:app
var users = [ { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }, { 'user': 'pebbles', 'age': 18 } ];
1.获取全部用户名字,并以”,“分割
var names = _.chain(users) .map(function(user){ return user.user; }) .join(" , ") .value(); console.log(names);
我的比较喜欢lodash延迟计算的现实value,以及JavaScript的函数式风格。在这里首先将users对象包装成为lodash对象,再map获取全部用户的名称,并最后利用join将用户名称以”,“链接在一块儿。注意这里只是一串方法链,若是你没有显样的调用value方法,使其当即执行的化,你将会获得以下的LodashWrapper延迟表达式:函数
LodashWrapper {__wrapped__: LazyWrapper, __actions__: Array[1], __chain__: true, constructor: function, after: function…}
由于延迟表达式的存在,所以咱们能够屡次增长方法链,但这并不会被执行,因此不会存在性能的问题,最后知道咱们须要使用的时候,使用value显式当即执行便可。工具
2. 获取最年轻的用户
var youngest = _.chain(users) .min(function(user){ return user.age; }) .value(); console.log(youngest);
这里利用了lodash提供的min函数能够轻易的解决。性能
在这里博主还但愿用另一个方式解释lodash方法链的优化,上面的方法能够等价为下面的方式,以age排序的第一个user:优化
var youngest2 = _.chain(users) .sortBy("age") .map(function(user){ console.log("map", user); return user; }) .first() .value(); console.log(youngest2);
在这里博主多加了一个map做为log输出,若是你执行这行代码的时候,你会惊奇的看见这里只会有一个user的输出,这点能够证实在当即执行的时候lodash为咱们的方法链作了可靠的优化;若是咱们去掉first函数你则会看见有3个user对象的输出。code
3. 获取最年长的用户
var oldest = _.chain(users) .max(function(user){ return user.age; }) .value(); console.log(oldest );
这里则使用lodash的max函数。
4. 用户数组到用户Map的转换
在开发中咱们常常会有把一堆素组形式的数据转换为Object形式的数组,便于根据属性key值查找,下面将以user对象来演示:
var userObj = _.chain(users) .map(function(user){ return [user.user, user.age]; }) .zipObject() .value(); console.log(userObj);
利用lodash首先将user数组map为[key, value]的数组集合,最后利用zipObject将结果转换为Object对象,zipObject会利用结果集的第一项做为key,第二项做为value生产Object。
结尾
咱们在这里展现知识lodash中很小一部分的API,正如随笔开始所说:lodash是为了提供更多“一致的跨浏览器行为……,并改善性能”API。全部的lodash API你能够在这里https://lodash.com/docs#matches查找。
本文的所演示的demo,你也能够在jsbin http://jsbin.com/xocixubaru/1/edit?html,js,output演示。