我最近听说了Facebook的Immutable.js库(https://github.com/facebook/immutable-js)。我对他们的文件中的以下内容感到困惑:
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过滤器怎么叫两次,映射一次?
发布于 2014-09-16 17:42:47
由于映射和过滤的逻辑对序列的延迟求值
映射
对映射序列进行调用,返回映射函数处理的原始序列的最后一个()。
例如:
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上找到匹配条件的值。所以,例如
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功能的情况下返回该值作为最后一个值。
作为帮助理解的另一个例子:
var mappedSequence = Immutable.Sequence(1,2,3,4,6,8).filter(x => x % 2);
console.log(mappedSequence.last());将调用筛选函数4次,一次为8次(结果为假),一次为6次(再次为假),一次为4次(再次为假),最后为3次(最终为真)。
将这两部分组合在一起
你的例子:
var oddSquares = Immutable.Sequence(1,2,3,4,5,6,7,8)
.filter(x => x % 2).map(x => x * x);
console.log(oddSquares.last());最后,我们将筛选函数两次调用,映射函数只调用一次。
https://stackoverflow.com/questions/25874826
复制相似问题