数组多次 filter, 多次 map 混合链式调用过程中, 有没有办法只在最后一次调用时生成一次数组呢?

数组多次 filter, 多次 map 混合链式调用过程中, 有没有办法只在最后一次调用时生成一次数组呢?,第1张

数组多次 filter, 多次 map 混合链式调用过程中, 有没有办法只在最后一次调用时生成一次数组呢?,第2张

貌似每次 filter 或 map 都会返回一个新的数组, 对性能和内存 GC 影响很大. 不知有没有类似 Java 的 Lambda, C#的 Linq, 不论链式调用了多少次 filter, map, select, 都不会生成最终的数组或链表, 而是将这些条件判断函数 /方法存储起来, 直到遇到最后的终结点时, 才进行遍历, 依次匹配前面保存的条件判断, 最终返回一个数组或链表.

----------------------- 以下是精选回复-----------------------

答:https://nestedsoftware.com/2018/02/27/lazy-evaluation-in-javascript-with-generators-map-filter-and-reduce-36h5.21002.html
答:https://lodash.com/docs/4.17.15#lodash
答:用 for 循环写
开玩笑的,都用上 js 这种高级语言了,正常使用不需要在乎这点性能,又不是刷算法题。
答:最常用就 lodash 的 chain 咯
答:建议不要在乎性能,除非真的遇到性能问题,然后用单次 forEach 解决。至于 lodash ,使用这个东西,写出来的都不像 JS ,感觉就是完全不同的另一门语言
答:如果你的 filter map 传入的函数都是纯函数的话,可以把函数 compose 一遍,在调用。
答:RxJS ,就是你想要的
答:除非代码不能用了,否则绝不优化
即使不能用了,先想想能不能升级硬件

过早优化乃万恶之源
答:原来这个部分 JS 是没有惰性求值的,学习了。
答:你要不手写 for 循环吧
答:不是搞个 lazy 就能神奇的帮你优化的。这种工具库好多,你自己找个,测测耗时吧。
答:你要不手写 for 循环
答:是你真的碰到了性能问题还是你单纯的觉得这么写不好?
Lodash 有个 chain 可以惰性求值不知道有多大优化
你也可以手动 flatMap 把多次遍历合并成一次
答:我的 Scala 应用基本上都是每次链式调用求值一次列表,也没比别人 Java 少快几倍。

而且 JS 有 VM + GC ,除非你跑过 perf 确认这里有性能瓶颈,不然我建议你不要瞎优化,可能适得其反。因为 Lazy evaluation 也是有 overhead 的,数据量小了不如立即求值。

如果数据量真的大到有必要实施 lazy evaluation 的程度,那我也建议一步到位 RxJS
答:Rust 的话就会对这种情况优化,测出来甚至比直接 for 循环更快。
答:lazy.js 可以做到,不过这个库好久没维护了。

https://github.com/dtao/lazy.js
答:超过三次我宁愿 for 写一遍,看起来更清晰。
答:transducer
答:应该不行吧,又不是 linq

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 数组多次 filter, 多次 map 混合链式调用过程中, 有没有办法只在最后一次调用时生成一次数组呢?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情