貌似每次 filter 或 map 都会返回一个新的数组, 对性能和内存 GC 影响很大. 不知有没有类似 Java 的 Lambda, C#的 Linq, 不论链式调用了多少次 filter, map, select, 都不会生成最终的数组或链表, 而是将这些条件判断函数 /方法存储起来, 直到遇到最后的终结点时, 才进行遍历, 依次匹配前面保存的条件判断, 最终返回一个数组或链表.
![]() |
1
ecnelises 187 天前 via iPhone
|
![]() |
2
SoloCompany 187 天前 via iPad
|
3
dcsuibian 187 天前
用 for 循环写
开玩笑的,都用上 js 这种高级语言了,正常使用不需要在乎这点性能,又不是刷算法题。 |
4
hundandadi 187 天前 via Android
@dcsuibian 养成个好习惯还是有用的,前几天枚举类型 values 循环 filter 匹配的写法,线上 CPU 升高 10%,定位问题定位了两天才找出来,压测过不了很难受,所以能注意还是注意的好
|
5
Leviathann 187 天前
最常用就 lodash 的 chain 咯
|
![]() |
6
autoxbc 187 天前
建议不要在乎性能,除非真的遇到性能问题,然后用单次 forEach 解决。至于 lodash ,使用这个东西,写出来的都不像 JS ,感觉就是完全不同的另一门语言
|
7
isBitter 187 天前
如果你的 filter map 传入的函数都是纯函数的话,可以把函数 compose 一遍,在调用。
|
8
Magentaize 187 天前 via iPhone
RxJS ,就是你想要的
|
![]() |
9
masterclock 187 天前 ![]() 除非代码不能用了,否则绝不优化
即使不能用了,先想想能不能升级硬件 过早优化乃万恶之源 |
10
bthulu OP @masterclock 无法升级硬件, 部署到客户那边的, 客户随时可能拎出来一台 2000 年的奔腾机器给你
|
![]() |
11
echo1937 187 天前
原来这个部分 JS 是没有惰性求值的,学习了。
|
![]() |
12
musi 187 天前
你要不手写 for 循环吧
|
![]() |
13
ChefIsAwesome 187 天前
不是搞个 lazy 就能神奇的帮你优化的。这种工具库好多,你自己找个,测测耗时吧。
|
![]() |
14
bojackhorseman 187 天前
你要不手写 for 循环
|
15
mxT52CRuqR6o5 187 天前 via Android
是你真的碰到了性能问题还是你单纯的觉得这么写不好?
Lodash 有个 chain 可以惰性求值不知道有多大优化 你也可以手动 flatMap 把多次遍历合并成一次 |
17
lmshl 187 天前
我的 Scala 应用基本上都是每次链式调用求值一次列表,也没比别人 Java 少快几倍。
而且 JS 有 VM + GC ,除非你跑过 perf 确认这里有性能瓶颈,不然我建议你不要瞎优化,可能适得其反。因为 Lazy evaluation 也是有 overhead 的,数据量小了不如立即求值。 如果数据量真的大到有必要实施 lazy evaluation 的程度,那我也建议一步到位 RxJS |
![]() |
18
ryougifujino 187 天前
Rust 的话就会对这种情况优化,测出来甚至比直接 for 循环更快。
|
![]() |
19
hronro 186 天前
|
![]() |
20
rrfeng 186 天前 via Android
超过三次我宁愿 for 写一遍,看起来更清晰。
|
21
honhon 186 天前
你要不手写 for 循环吧
|
22
molika 186 天前
transducer
|
25
frisktale 186 天前
应该不行吧,又不是 linq
|