推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
bthulu

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

  •  
  •   bthulu · Jul 25, 2022 · 5130 views
    This topic created in 1568 days ago, the information mentioned may be changed or developed.

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

    25 replies  •  2022-07-26 17:31:54 +08:00
    dcsuibian
    dcsuibian
    Jul 26, 2022
    3
    用 for 循环写
    开玩笑的,都用上 js 这种高级语言了,正常使用不需要在乎这点性能,又不是刷算法题。
    hundandadi
    hundandadi
    Jul 26, 2022 via Android
    4
    @dcsuibian 养成个好习惯还是有用的,前几天枚举类型 values 循环 filter 匹配的写法,线上 CPU 升高 10%,定位问题定位了两天才找出来,压测过不了很难受,所以能注意还是注意的好
    Leviathann
    Leviathann
    Jul 26, 2022
    5
    最常用就 lodash 的 chain 咯
    autoxbc
    autoxbc
    Jul 26, 2022
    6
    建议不要在乎性能,除非真的遇到性能问题,然后用单次 forEach 解决。至于 lodash ,使用这个东西,写出来的都不像 JS ,感觉就是完全不同的另一门语言
    isBitter
    isBitter
    Jul 26, 2022
    7
    如果你的 filter map 传入的函数都是纯函数的话,可以把函数 compose 一遍,在调用。
    Magentaize
    Magentaize
    Jul 26, 2022 via iPhone
    8
    RxJS ,就是你想要的
    masterclock
    masterclock
    Jul 26, 2022❤️1
    9
    除非代码不能用了,否则绝不优化
    即使不能用了,先想想能不能升级硬件

    过早优化乃万恶之源
    bthulu
    bthulu
    OP
    Jul 26, 2022
    10
    @masterclock 无法升级硬件, 部署到客户那边的, 客户随时可能拎出来一台 2000 年的奔腾机器给你
    echo1937
    echo1937
    Jul 26, 2022
    11
    原来这个部分 JS 是没有惰性求值的,学习了。
    musi
    musi
    Jul 26, 2022
    12
    你要不手写 for 循环吧
    ChefIsAwesome
    ChefIsAwesome
    Jul 26, 2022
    13
    不是搞个 lazy 就能神奇的帮你优化的。这种工具库好多,你自己找个,测测耗时吧。
    dumbass
    dumbass
    Jul 26, 2022
    14
    你要不手写 for 循环
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Jul 26, 2022 via Android
    15
    是你真的碰到了性能问题还是你单纯的觉得这么写不好?
    Lodash 有个 chain 可以惰性求值不知道有多大优化
    你也可以手动 flatMap 把多次遍历合并成一次
    lin07hui
    lin07hui
    Jul 26, 2022
    16
    @bthulu #10 2000 年的奔腾机器能用上现代浏览器吗?用 IE ?
    lmshl
    lmshl
    Jul 26, 2022
    17
    我的 Scala 应用基本上都是每次链式调用求值一次列表,也没比别人 Java 少快几倍。

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

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

    https://github.com/dtao/lazy.js
    rrfeng
    rrfeng
    Jul 26, 2022 via Android
    20
    超过三次我宁愿 for 写一遍,看起来更清晰。
    honhon
    honhon
    Jul 26, 2022
    21
    你要不手写 for 循环吧
    molika
    molika
    Jul 26, 2022
    22
    transducer
    bthulu
    bthulu
    OP
    Jul 26, 2022
    23
    @lin07hui 用浏览器干嘛? 我这是跑后台服务, 控制厂内设备自动寻路的
    bthulu
    bthulu
    OP
    Jul 26, 2022
    24
    @honhon 没法手写, 是个公共基类, 会不断有继承类对这个上层数组进行过滤处理. 基类是没法预知所有子类行为的
    frisktale
    frisktale
    Jul 26, 2022
    25
    应该不行吧,又不是 linq
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3089 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 04:11 · PVG 12:11 · LAX 20:11 · JFK 23:11
    ♥ Do have faith in what you're doing.