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

2022-04-06 11:24:33 +08:00
 CalmSea

描述: 使用 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:[]})

1455 次点击
所在节点    JavaScript
7 条回复
shintendo
2022-04-06 11:27:17 +08:00
这是什么骚操作,为啥要在 reduce 里增减数组项
sweetcola
2022-04-06 11:31:26 +08:00
你 push 的是 item 的引用(地址)
shintendo
2022-04-06 11:32:21 +08:00
@shintendo 看错了,当我没说。但是仍然很奇怪,直接 forEach 不行吗?关于你的问题,item 是对象,push 的是引用,item 始终都是同一个
CalmSea
2022-04-06 11:33:00 +08:00
我想把 狗 猫 push 到 children[], 然后删除 parent 属性, 我不理解为什么是在 delete 前 push 的.
CalmSea
2022-04-06 11:34:58 +08:00
哦我理解了, 难怪可以后 delete. 感谢
Envov
2022-04-07 00:36:31 +08:00
reduce 里面要写纯函数,改变 result 的状态是非常危险的
libook
2022-04-08 10:57:29 +08:00
push 和 delete 没有顺序关系,不管先 push 还是后 push ,item 都是引用的 item ,你就是把 item 给赋值到全局作用域,在其他域进行 delete 也是可以删除 parent 这个字段的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845177

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX