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