1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# 文档地址 http://underscorejs.org/#collections // 提供一系列函数式编程接口,与jQuery的$类型,把自身绑定到唯一的全局变量_上 // 集合类是指Array和Object,暂不支持Map和Set _.map({a:1,b:2}, (v,k) => k+'='+v); // ['a=1', 'b=2'] _.map([1, 2], (x) => x*x); // [1, 4] _.mapObject({a:1,b:2}, (v,k) => k+'='+v); // {a:'a=1', b:'b=2'} _.filter([1,2,3,99], function(x) { // [1, 2, 4] if (x > 10) { return false; } return true; }); // _.every(集合内所有元素满足条件返回true) // _.some(集合内任一元素满足条件返回true) // _.max _.min 空集合会返回Infinity和-Infinity Object只能作用于value,不能作用于key // _.groupBy分类 // {A:[100, 200], B:[10, 20], C:[1, 2], undefined:[-1]} var groups = _.groupBy([1,2,10,20,100,200,-1], function(x) { if (x >= 100) { return 'A'; } else if (x >= 10) { return 'B'; } else if (x >= 1) { return 'C'; } }); // _.shuffle用洗牌算法随机打乱一个集合 // _.sample随机选择一个或多个元素 # underscore为Array提供了许多工具类方法 // _.first(arr); _.last(arr); // _.flatten接收一个array,无论它多少维,整成一维 // [1, 2, 3, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3] _.flatten([ 1, [2, 3], 2, 3, [4, [5, 6, [7, 8]]], [1, 2, 3] ]); // _.zip把两个或多个数组按索引对齐合并 // [['Adam', 85], ['Lisa', 92], ['Bart', 59]] var names = ['Adam', 'Lisa', 'Bart']; var scores = [85, 92, 59]; var rs = _.zip(names, scores); // _.unzip则是反过来(但是它返回的不是多个数组,外层有一个大数组包裹) // [['Adam', 'Lisa', 'Bart'], [85, 92, 59]] _.unzip(rs); // _.object(只接收两个参数) _.object(names, scores); // {Adam: 85, Lisa: 92, Bart: 59} // _.range _.range(10); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // _.bind // 以下这种写法会报错 var log = console.log; log('Hello, world!'); // 需要使用call,传入this log.call(console, 'Hello world!'); // 使用_.bind可以直接绑定 var log = _.bind(console.log, console); log('Hello, world!'); // _.partial(偏函数) var pow2N = _.partial(Math.pow, 2); //pow2N(3);2的三次方=8 pow2N(4);2的四次方=16 var powN3 = _.partial(Math.pow, _, 3); //powN3(2);2的三次方(_是占位符) powN3(4);4的三次方=64 // _.memoize(有些开销大的函数可以用它缓存结果) // 该函数一般配合递归调用使用,可以把每次递归的结果缓存 // _.once(保证某个函数只执行一次) // _.delay(和setTimeout()效果一样) _.delay(alert, 2000, 'param'); # underscore为Object提供了许多工具类方法 _.keys(obj); //返回对象所有的key,但不包括从原型链上继承下来的 _.allKeys(obj); //返回对象所有的key,包括从原型链上继承下来的 _.values(obj); //返回对象所有的值,但不包括从原型链上继承下来的 _.invert(obj); //把对象的key、value互换 // _.extend 如果有相同的key,后面的object的value将覆盖前面的object的value var a = {name: 'Bob', age: 20}; // 返回并且a的内容也变成 {name: 'Bob', age: 88, city: 'Beijing'} _.extend(a, {age: 15}, {age: 88, city: 'Beijing'}); // _.extendOwn与_extend类似,但获取属性时忽略从原型链继承下来的属性 _.clone(obj); //克隆对象,浅复制 # _.isEqual 比较对象和数组 // _.isEqual 对两个object进行深度比较,如果内容完全相同,则返回true var o1 = { name: 'Bob', skills: { Java: 90, JavaScript: 99 }}; var o2 = { name: 'Bob', skills: { JavaScript: 99, Java: 90 }}; o1 === o2; // false _.isEqual(o1, o2); // true # 链式调用 // 因为每一步返回的都是包装对象,所有最后一步需要调用value方法获取值 _.chain([1, 4, 9, 16, 25]) .map(Math.sqrt) .filter(x => x % 2 === 1) .value(); |