首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Immutable.js -惰性序列

Immutable.js -惰性序列
EN

Stack Overflow用户
提问于 2014-09-16 17:18:27
回答 1查看 2.5K关注 0票数 7

我最近听说了Facebook的Immutable.js库(https://github.com/facebook/immutable-js)。我对他们的文件中的以下内容感到困惑:

代码语言:javascript
复制
var oddSquares = Immutable.Sequence(1,2,3,4,5,6,7,8)
  .filter(x => x % 2).map(x => x * x);
console.log(oddSquares.last());

In this example, no intermediate arrays are ever created, filter is only called twice, and map is only called once

过滤器怎么叫两次,映射一次?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-16 17:42:47

由于映射和过滤的逻辑对序列的延迟求值

映射

对映射序列进行调用,返回映射函数处理的原始序列的最后一个()。

例如:

代码语言:javascript
复制
 var mappedSequence = Immutable.Sequence(1,2,3,4,5,6,7,8).map(x => x * x);
 console.log(mappedSequence.last());

将输出64,并且只调用map 一次,因为它所做的唯一事情是获取原始序列(8)的最后一个元素,并将其映射到x => x*x(由此产生的64)上。

滤波器

最后()对过滤后的序列调用,反向遍历该序列,直到它在sequnce上找到匹配条件的值。所以,例如

代码语言:javascript
复制
 var mappedSequence = Immutable.Sequence(1,2,3,4,5,6,7,8).filter(x => x % 2);
 console.log(mappedSequence.last());

WIll输出7并将只调用筛选器()两次,因为它首先对8调用筛选器(x => x% 2),对javascript返回0表示false (因此应该对其进行过滤),然后再次调用filter函数,以获得javascript为真的7%2=1,并在不调用filter功能的情况下返回该值作为最后一个值。

作为帮助理解的另一个例子:

代码语言:javascript
复制
 var mappedSequence = Immutable.Sequence(1,2,3,4,6,8).filter(x => x % 2);
 console.log(mappedSequence.last());

将调用筛选函数4次,一次为8次(结果为假),一次为6次(再次为假),一次为4次(再次为假),最后为3次(最终为真)。

将这两部分组合在一起

你的例子:

代码语言:javascript
复制
var oddSquares = Immutable.Sequence(1,2,3,4,5,6,7,8)
   .filter(x => x % 2).map(x => x * x);
console.log(oddSquares.last());
  1. 要获得映射序列的最后一个()值,首先要获得过滤序列的最后一个()值。
  2. 为了获得过滤序列的最后()值,它首先得到原始序列(8)的最后一个()值,然后对它重新计算筛选函数(x => x%2 ),第一次调用它
  3. 由于8%2= 0,它在JS上是假的,应该被过滤,所以,我们移到下一个值(7),再次用这个值调用filter函数
  4. 7%2= 1,它在JS上是正确的,不应该被过滤,因此,这是过滤序列的最后一个值。
  5. 我们有映射序列所需的最后一个值(7),因此我们只调用映射函数(x => x* x) 一次即可得到49,最后的结果。

最后,我们将筛选函数两次调用,映射函数只调用一次

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25874826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档