lodash 学习笔记 (6)

应用:通过 flow 对函数进行任意的组合,这样可以极大的增加函数的灵活性和复用性。

let forA = function (a1, a2) { return Math.pow(a1 - a2, 2); }; let dist = _.flow([ function (x1, y1, x2, y2) { return forA(x1, x2) + forA(y1, y2) }, Math.sqrt, Math.round ]); console.log(dist(10, 15, 90, 22)); // 80

flow 跟 下面介绍的 chain 有异曲同工之妙

(8)混入

mixin - 添加来源对象自身的所有可枚举函数属性到目标对象。(默认目标对象为 lodash 自身

还有一个跟 minxin 类似的 runInContext 函数,待写。

注:下面例子涉及到 链式操作,下面一节会详细介绍。

// 开启链式操作(默认) _.mixin({ capitalize_by_colin: function(string) { return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase(); } }); re1 = _.capitalize_by_colin("fabio"); re2 = _("fabio") .capitalize_by_colin() .value(); console.log(re1);    // Fabio console.log(re2);    // Fabio // 关闭链式操作 _.mixin( { capitalize_by_colin: function(string) { return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase(); } }, { chain: false } ); re3 = _.capitalize_by_colin("fabio"); re4 = _("fabio").capitalize_by_colin(); console.log(re3);    // Fabio console.log(re4);    // Fabio (9)其他更多

1、为了跟 filter 等方法合作, lodash 创造了一些便捷方法:

matches

matchesProperty

property

上面支持 简写 和 iteratee 形式的缩写

conforms

var users = [ { user: "barney", age: _.constant(36), active: true }, { user: "fred", age: _.constant(40), active: false } ]; // origin console.log( _.filter(users, function(o) { return !o.active; }) ); // => objects for ['fred'] // _.matches - 针对 对象 or 子对象 console.log(_.filter(users, { user: "barney", active: true })); console.log(_.filter(users, _.iteratee({ user: "barney", active: true }))); console.log(_.filter(users, _.matches({ user: "barney", active: true }))); // => objects for ['barney'] // _.matchesProperty - 针对 对象的单个属性和值 console.log(_.filter(users, ["user", "fred"])); console.log(_.filter(users, _.iteratee(["user", "fred"]))); console.log(_.filter(users, _.matchesProperty("user", "fred"))); // => objects for ['fred'] // _.property - 针对 对象的单个属性 console.log(_.filter(users, "active")); console.log(_.filter(users, _.iteratee("active"))); console.log(_.filter(users, _.property("active"))); // => objects for ['barney'] // _.conforms - 针对 对象的单个属性和值(更灵活) console.log(_.filter(users, _.conforms({ 'user': function(user) { return user === 'fred'; } }))) // => objects for ['fred']

2、为了跟 map 等方法合作, lodash 创造了一些便捷方法:

method

var users = [ { user: "barney", age: _.constant(36), active: true }, { user: "fred", age: _.constant(40), active: false } ]; // _.method - 针对 对象的单个属性值(以函数的形式调用) console.log(_.map(users, _.method("age"))); // => [ 36, 40 ]

上述介绍的 property 和 method 分别有相反的版本:propertyOf 和 methodOf。

用法待写。

11、Seq (1)创建链对象

1、通过_(value)建立了一个隐式链对象

2、通过_.chain(value)建立了一个显式链对象

3、也可通过_(value).chain()从隐式转成显式。

(2)显式链 (Explicit Chaining) / 隐式链 (Implicit Chaining) 区别

显式链调用的话,需要通过commit() 手动结束链式反应,或者 value() 手动结束链式反应并提取值

隐式链调用的话,碰到能返回唯一值 (single value) 或原生数据类型(primitive value),才会自动结束链式反应并自动提取值。否则需要你像上面一样手动操作。

例如 sum 可以触发隐式链调用的自动结束,但是 filter 不行。

什么时候用显式/隐式?

显式对 commit 和 value 更可控,灵活度更高。

隐式可以简洁代码。

(3)链式(队列)调用 与 Lazy evaluation(惰性计算)

链式队列调用的过程中,可以把很多操作串起来,然后一起做 Lazy evaluation(惰性计算),这中间会允许一些方法 shortcut fusion 。

shortcut fusion 是一种通过合并链式 iteratee 调用从而大大降低迭代的次数以提高执行性能的方式。

所以推荐使用显式链调用,这样可以可控的、最大化的利用 Lazy evaluation。

注意:但也要谨慎创建链对象,因为会导致高内存使用率,从而降低性能。


lodash 有些方法不支持链式调用,如 reduce。详细如下:

支持 链式调用 的方法: after, ary, assign, assignIn, assignInWith, assignWith, at, before, bind, bindAll, bindKey, castArray, chain, chunk, commit, compact, concat, conforms, constant, countBy, create, curry, debounce, defaults, defaultsDeep, defer, delay, difference, differenceBy, differenceWith, drop, dropRight, dropRightWhile, dropWhile, extend, extendWith, fill, filter, flatMap, flatMapDeep, flatMapDepth, flatten, flattenDeep, flattenDepth, flip, flow, flowRight, fromPairs, functions, functionsIn, groupBy, initial, intersection, intersectionBy, intersectionWith, invert, invertBy, invokeMap, iteratee, keyBy, keys, keysIn, map, mapKeys, mapValues, matches, matchesProperty, memoize, merge, mergeWith, method, methodOf, mixin, negate, nthArg, omit, omitBy, once, orderBy, over, overArgs, overEvery, overSome, partial, partialRight, partition, pick, pickBy, plant, property, propertyOf, pull, pullAll, pullAllBy, pullAllWith, pullAt, push, range, rangeRight, rearg, reject, remove, rest, reverse, sampleSize, set, setWith, shuffle, slice, sort, sortBy, splice, spread, tail, take, takeRight, takeRightWhile, takeWhile, tap, throttle, thru, toArray, toPairs, toPairsIn, toPath, toPlainObject, transform, unary, union, unionBy, unionWith, uniq, uniqBy, uniqWith, unset, unshift, unzip, unzipWith, update, updateWith, values, valuesIn, without, wrap, xor, xorBy, xorWith, zip, zipObject, zipObjectDeep, and zipWith。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygjgp.html