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

关于使用 reduce() 执行顺序的问题

  •  
  •   CalmSea · 2022-04-06 11:24:33 +08:00 · 1348 次点击
    这是一个创建于 744 天前的主题,其中的信息可能已经有所发展或是发生改变。

    描述: 使用 reduce() 实现数组的变化 为什么 push 后,后面的 delete 会对 childern 生效, 不应该只对 item 生效吗?

    我的理解: 应该在 push 前就 delete.

    let arr = [
    { 名称:'动物', id: 1, parent: null},
    { 名称:'狗', id: 2, parent: 1},
    { 名称:'猫', id: 3, parent: 1}
    ]
    
    arr.reduce((result,item)=>{
        if (item.parent===null){
            result.id = item.id;
            result.名称 = item.名称;
        }else{
            result.children.push(item);
            delete item.parent;
            item.children = null;
        }
        return result;
    },{id:null,children:[]})
    
    
    7 条回复    2022-04-08 10:57:29 +08:00
    shintendo
        1
    shintendo  
       2022-04-06 11:27:17 +08:00
    这是什么骚操作,为啥要在 reduce 里增减数组项
    sweetcola
        2
    sweetcola  
       2022-04-06 11:31:26 +08:00
    你 push 的是 item 的引用(地址)
    shintendo
        3
    shintendo  
       2022-04-06 11:32:21 +08:00
    @shintendo 看错了,当我没说。但是仍然很奇怪,直接 forEach 不行吗?关于你的问题,item 是对象,push 的是引用,item 始终都是同一个
    CalmSea
        4
    CalmSea  
    OP
       2022-04-06 11:33:00 +08:00
    我想把 狗 猫 push 到 children[], 然后删除 parent 属性, 我不理解为什么是在 delete 前 push 的.
    CalmSea
        5
    CalmSea  
    OP
       2022-04-06 11:34:58 +08:00
    哦我理解了, 难怪可以后 delete. 感谢
    Envov
        6
    Envov  
       2022-04-07 00:36:31 +08:00 via iPhone
    reduce 里面要写纯函数,改变 result 的状态是非常危险的
    libook
        7
    libook  
       2022-04-08 10:57:29 +08:00
    push 和 delete 没有顺序关系,不管先 push 还是后 push ,item 都是引用的 item ,你就是把 item 给赋值到全局作用域,在其他域进行 delete 也是可以删除 parent 这个字段的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5233 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:09 · PVG 15:09 · LAX 00:09 · JFK 03:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.