请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于forEach的问题

只有在 c.pid 的值为空的情况下才会将当前的 ‘c’ push 到 chapterTree, 相当于只会将所有的"父章节" push 到 chapterTree 中,那为什么最终输出的结果是 chapterTree[0].children 中的包含有"子章节",else 里面并没有对 chapterTree 有别的操作啊,怎么就影响到 chapterTree呢,究竟 “子章节” 是怎么被 push 到 chapterTree 里的,受了哪行代码的影响?
js 基础知识有些薄弱,苦恼了许久,望老师解答,谢谢!

图片描述

测试代码:

var arr = [
  {
    id: '1',
    pid: '',
  },
  {
    id: '1.1',
    pid: '1',
  },
  {
    id: '1.2',
    pid: '1',
  },
  {
    id: '2',
    pid: '',
  }
]
var newArr = []
arr.forEach(item => {
    item.children = []
    if (item.pid === '') {
        newArr.push(item)
    } else {
        const parent = arr.find(c => c.id === item.pid)
        parent.children.push(item)
    }
})

正在回答 回答被采纳积分+3

1回答

扬_灵 2020-07-10 18:53:28

同学你好,这个逻辑是这样的,先遍历arr或者arr中每个对象,判断对象中是否存在pid,如果不存在pid就表示这个一级元素直接push到newArr中,如果存在pid表示这个对象是一级对象的子级,然后使用find函数查找arr数组中id===当前对象的pid,给这个对象添加一个childred属性将二级对象push进去,如果不能解决你的问题,可以继续追问。

0 回复 有任何疑惑可以回复我~
  • 提问者 Kunen #1
    这个逻辑我能明白。我的问题是为什么 push 给parent 的子级,却影响了 newArr,而 parent 是从arr 里拿到的对象,这里并没有对 newArr 直接 push 啊?
    回复 有任何疑惑可以回复我~ 2020-07-11 13:09:42
  • 扬_灵 回复 提问者 Kunen #2
    在这里是给有pid的对象定义了一个children数组把arr数组中id===当前对象的pid存放在了里面,当循环到这个对象的时候就直接添加进去了。你可以在 if (item.pid === '') {}打印一下item看一下。
    回复 有任何疑惑可以回复我~ 2020-07-12 11:21:59
  • 提问者 Kunen 回复 扬_灵 #3
    我明白了,push 到 newArr 的对象其实是数据引用的方式
    回复 有任何疑惑可以回复我~ 2020-07-13 16:11:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信