V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yuan321
V2EX  ›  JavaScript

js 中 foreach,map,find,filter,reduce 的适用场景分别是哪些?

  •  
  •   yuan321 · 2022-05-12 14:59:22 +08:00 · 2608 次点击
    这是一个创建于 932 天前的主题,其中的信息可能已经有所发展或是发生改变。

    js 中 foreach,map,find,filter,reduce 的适用场景分别是哪些?他们的相同点和不同点又有哪些呢?

    18 条回复    2022-06-18 18:23:18 +08:00
    libook
        1
    libook  
       2022-05-12 15:06:25 +08:00   ❤️ 1
    可以看 Reference 文档对比一下
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

    相同点只是用了迭代器,除此之外功能不一样;一项需求如果有现成方法就可以实现就直接用现成方法,没有的话再用需要加工数量最少的方法。

    比如你要把一个数组里的每一个元素加工后再生成另一个数组,你用 forEach 也可以实现,甚至用 for 循环,但都需要自己额外写一些代码,不如直接用 map 方便。
    Pastsong
        2
    Pastsong  
       2022-05-12 15:10:33 +08:00
    English 啊 English
    molvqingtai
        3
    molvqingtai  
       2022-05-12 15:41:16 +08:00
    可以分为两类,一种有副作用,一种是无副作用
    molvqingtai
        4
    molvqingtai  
       2022-05-12 15:42:27 +08:00
    foreach 没有返回值,用于改变原数组或做一些其操作
    molvqingtai
        5
    molvqingtai  
       2022-05-12 15:43:40 +08:00
    其他都是纯函数
    murmur
        6
    murmur  
       2022-05-12 16:01:09 +08:00
    reduce 没用过,其余的都挺常用,数据处理,过滤下接口转个格式啥的
    DOLLOR
        7
    DOLLOR  
       2022-05-12 16:07:00 +08:00   ❤️ 1
    // 单纯地遍历
    Array.prototype.forEach

    // 检测数组中是否有元素符合条件
    Array.prototype.some

    // 检测数组中是否所有元素符合条件
    Array.prototype.every

    // 用来将一个列表转换成另一个等长的列表
    Array.prototype.map

    // 用来将一个列表转换成一个值
    Array.prototype.reduce

    // 从列表中找出符合条件的一个元素
    Array.prototype.find

    // 从列表中找出符合条件的若干元素
    Array.prototype.filter

    // 拍平列表
    Array.prototype.flat

    // map 和 flat 的结合,适合用来将一个列表转换成另一个不等长的列表
    Array.prototype.flatMap
    FaiChou
        8
    FaiChou  
       2022-05-12 16:13:16 +08:00
    Reduce 的一共场景: https://v2ex.com/t/852210#reply6
    duduaba
        9
    duduaba  
       2022-05-12 16:19:47 +08:00
    语法糖,for 循环变种,理解为 lodash 工具集封装就行
    Building
        10
    Building  
       2022-05-12 16:31:20 +08:00
    ……我无语了,这么直白的英语,这么直白的函数,再不济一个个跑一遍也搞懂了吧
    luob
        11
    luob  
       2022-05-12 17:04:47 +08:00
    会用 reduce 就行了,其他的都相当于是 reduce 的语法糖
    gzyguy
        12
    gzyguy  
       2022-05-12 18:23:46 +08:00 via iPhone
    7 楼正解。
    Envov
        13
    Envov  
       2022-05-12 18:54:28 +08:00
    7 楼正解,这里有一个比较晦涩的 reduce ,很短,但是实现了 composeM
    Envov
        14
    Envov  
       2022-05-12 18:54:35 +08:00
    lmshl
        15
    lmshl  
       2022-05-12 19:24:45 +08:00
    foreach
    我想把所有元素都过一遍(比如,控制台打印所有元素)
    map
    我想把所有元素都改成另一个样(比如,给所有字符串末尾加一个逗号)
    find
    我想从数组中找符合我要求的第一个元素(比如,从用户数组中找第一个符合条件的用户)
    filter
    我想剔除部分元素,仅保留我需要的元素(比如,从用户数组中过滤掉非管理员用户)
    reduce
    我想把所有元素合并成一个元素(比如,对整数数组求和)
    Danswerme
        16
    Danswerme  
       2022-05-12 19:28:48 +08:00
    @Envov 谢谢🙏,成功烧死了一吨脑细胞,看了十分钟之后终于绕明白了。
    Mutoo
        17
    Mutoo  
       2022-05-13 07:45:25 +08:00
    推荐一篇 FP 相关的文章,介绍了 transducer 和 reducer 相关的知识

    https://medium.com/@thi.ng/of-umbrellas-transducers-reactive-streams-mushrooms-pt-2-9c540beb0023
    AhECbt
        18
    AhECbt  
       2022-06-18 18:23:18 +08:00
    简单理解:

    遍历自己,遍历成别人,查找,过滤,运算
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2663 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.