欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

lodash 之 Chain 篇 显试调用与隐性调用

lodash 之 Chain篇 显试调用与隐性调用

Chain

可以说是 lodash 中最为重要的部件,想要用lodash进行复杂的多步操作都离不开chain的帮助。

首先说说Chain的调用方式有两种:一种是显式调用(Explicit Chaining),一种是隐式调用(Implicit Chaining)。

image.png

  1. //下面的例子采用了ECMAScript2015的语法:
  2. //显式调用例子如下:
  3. let numbers = [1, 2, 3, 4, 5];
  4. let sumOfEvenSquares = _.chain(numbers) //注意numbers放置的位置
  5. .filter(n => n % 2 === 0)
  6. .map(n => n * n)
  7. .sum()
  8. .value();
  9. //sumOfEvenSquares: 20
  10. //特别要注意结尾的那个.value()
  1. //隐式调用例子如下:
  2. let sumOfEvenSquares = _(numbers) //注意numbers的位置,不需要显式的使用chain关键字
  3. .filter(n => n % 2 === 0)
  4. .map(n => n * n)
  5. .sum()

  1. let isEven = n => n % 2 === 0;
  2. let square = n => n * n;
  3. let sumOfEvenSquares = _(numbers).filter(isEven).map(square).sum();

从上面例子可以看出,隐式调用比显式调用更加简洁方便。

为什么要多出来一个 .value(),而不是直接出结果呢?那是因为可能要等待延时(Deferred execution)数据的到来,再执行取值。这就是我们常说的Lazy evaluation (延迟计算/惰性求值)

image.png

  1. //如下面的例子:首先生成链式表达式
  2. var wallet = _(assets).filter(ownedBy('me'))
  3. .pluck('value')
  4. .reduce(sum);
  5. $json.get("/new/assets").success(function(data) {
  6. assets.push.apply(assets, data);     // 然后更新数据
  7. wallet.value();                      // 最后求值
  8. });

2.1 _(value)

显式(Explicit Chaining) or 隐式(Implicit Chaining)

听起来好乱!看看 lodash的API怎么说:

_(value) Creates a lodash object which wraps value to enable implicit chaining. Methods that operate on and return arrays, collections, and 
functions can be chained together. Methods that retrieve a single 
value or may return a primitive value will automatically end the chain 
returning the unwrapped value. Explicit chaining may be enabled using 
.chain. The execution of chained methods is lazy, that is, execution is deferred until #value is implicitly or explicitly called.

大意如下: 
_(value)建立了一个隐式链对象,可以把那些能操作并返回 arrays(数组)、collections(集合)、functions(函数)的”.Methods”(lodash的函数)串起来。 那些能返回“唯一值(single value)”或者可能返回原生数据类型(primitive value)会自动结束链式反应。 
而显式链则用_.chain. 的方式实现延迟计算,即:求值操作等到 _value()被调用时再执行。

Lazy evaluation allows several methods to support shortcut fusion. Shortcut fusion is an optimization strategy which merge iteratee calls; this can help to avoid the creation of intermediate data structures and greatly reduce the number of iteratee executions.

延迟计算允许一些方法支持shortcut fusion 。由于执行被延后了,因此lodash可以进行shortcut fusion这样的优化,通过合并链式iteratee大大降低迭代的次数。



普通分类: