不可变JS懒惰Seq链式方法

时间:2015-10-20 03:42:22

标签: javascript immutable.js

Immutable JS文档引用了Seq的惰性操作。特别是以下例子:

var oddSquares = Immutable.Seq.of(1,2,3,4,5,6,7,8).filter(x => x % 2).map(x => x * x);

console.log(oddSquares.get(1));

它表示过滤器被调用3次,地图被调用两次。我不明白导致方法被分别调用3次和2次的操作顺序。事实上,如果我不得不猜测正确的“懒惰”动作是什么,我会期望它们根本不会被调用,因为它们不需要执行所请求的操作(在集合中找到1)。有人可以帮我理解链式方法是如何调用的吗?

1 个答案:

答案 0 :(得分:0)

oddSquares.get(1)oddSquares获取第二个元素。

这意味着应该调用.map(x => x * x);两次来生成2个元素。

.map获取2个元素作为输入,.filter(x => x % 2)应生成2个元素。我们可以看到filter谓词过滤奇数。

要从初始序列Immutable.Seq.of(1,2,3,4,5,6,7,8)获得2个奇数,我们需要处理3个数字:1这是奇数,2是偶数,3是奇数

  Immutable.Seq.of     1 - 2 - 3 - 4 - 5 - 6 - 7 - 8
                       v   v   v 
filter(x => x % 2)     1 - - - 3
                       v       v 
   map(x => x * x)     1 - - - 9
                       v       v
            get(1)     - - - - 9