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

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

  •  
  •   CalmSea · Apr 6, 2022 · 2002 views
    This topic created in 1504 days ago, the information mentioned may be changed or developed.

    描述: 使用 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 replies    2022-04-08 10:57:29 +08:00
    shintendo
        1
    shintendo  
       Apr 6, 2022
    这是什么骚操作,为啥要在 reduce 里增减数组项
    sweetcola
        2
    sweetcola  
       Apr 6, 2022
    你 push 的是 item 的引用(地址)
    shintendo
        3
    shintendo  
       Apr 6, 2022
    @shintendo 看错了,当我没说。但是仍然很奇怪,直接 forEach 不行吗?关于你的问题,item 是对象,push 的是引用,item 始终都是同一个
    CalmSea
        4
    CalmSea  
    OP
       Apr 6, 2022
    我想把 狗 猫 push 到 children[], 然后删除 parent 属性, 我不理解为什么是在 delete 前 push 的.
    CalmSea
        5
    CalmSea  
    OP
       Apr 6, 2022
    哦我理解了, 难怪可以后 delete. 感谢
    Envov
        6
    Envov  
       Apr 7, 2022 via iPhone
    reduce 里面要写纯函数,改变 result 的状态是非常危险的
    libook
        7
    libook  
       Apr 8, 2022
    push 和 delete 没有顺序关系,不管先 push 还是后 push ,item 都是引用的 item ,你就是把 item 给赋值到全局作用域,在其他域进行 delete 也是可以删除 parent 这个字段的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3017 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 13:23 · PVG 21:23 · LAX 06:23 · JFK 09:23
    ♥ Do have faith in what you're doing.