underscore
Contents
Array有map()和filter()方法,可是Object没有这些方法。此外,低版本的浏览器例如IE6~8也没有这些方法,怎么办?正如jQuery统一了不同浏览器之间的DOM操作的差异,让我们可以简单地对DOM进行操作,underscore则提供了一套完善的函数式编程的接口,让我们更方便地在JavaScript中实现函数式编程。jQuery在加载时,会把自身绑定到唯一的全局变量$上,underscore与其类似,会把自身绑定到唯一的全局变量_上。
Collections
map/filter
12345678910111213var obj = {name: 'bob',school: 'No.1 middle school',address: 'xueyuan road'};//返回数组var upper = _.map(obj, function (value,key) {return key+'='+value;});//返回对象var upper = _.mapObject(obj, function (value,key) {return key+'='+value;});every/some
1234// 所有元素都大于0?_.every([1, 4, 7, -3, -9], (x) => x > 0); // false// 至少一个元素大于0?_.some([1, 4, 7, -3, -9], (x) => x > 0); // truemax/min
这两个函数直接返回集合中最大和最小的数
123456789var arr = [3, 5, 7, 9];_.max(arr); // 9_.min(arr); // 3// 空集合会返回-Infinity和Infinity,所以要先判断集合不为空:_.max([])-Infinity_.min([])Infinity如果集合是Object,max()和min()只作用于value,忽略掉key
1_.max({ a: 1, b: 2, c: 3 }); // 3
groupBy
集合的元素按照key归类,key由传入的函数返回12345678910111213141516var scores = [20, 81, 75, 40, 91, 59, 77, 66, 72, 88, 99];var groups = _.groupBy(scores, function (x) { if (x < 60) { return 'C'; } else if (x < 80) { return 'B'; } else { return 'A'; }});// 结果:// {// A: [81, 91, 88, 99],// B: [75, 77, 66, 72],// C: [20, 40, 59]// }
shuffle/sample
shuffle()用洗牌算法随机打乱一个集合
12// 注意每次结果都不一样:_.shuffle([1, 2, 3, 4, 5, 6]); // [3, 5, 4, 6, 2, 1]sample()则是随机选择一个或多个元素
12345// 注意每次结果都不一样:// 随机选1个:_.sample([1, 2, 3, 4, 5, 6]); // 2// 随机选3个:_.sample([1, 2, 3, 4, 5, 6], 3); // [6, 1, 4]