请教一个json数据转为树形结构的问题
发布于 7 年前 作者 xumjs8623 4806 次浏览 来自 问答

我在网上找了一段代码来转换,结果是符合要求的,但是代码一直看不懂,望社区朋友帮忙解释 原始数据 也就是data[0]

{
  "data": [
    {
      "id": 1,
      "pid": 0,
      "name": "1",
      "level": "1"
    },
    {
      "id": 2,
      "pid": 1,
      "name": "1-1",
      "level": "2"
    },
    {
      "id": 3,
      "pid": 2,
      "name": "1-1-1",
      "level": "3"
    },
    {
      "id": 4,
      "pid": 0,
      "name": "2",
      "level": "1"
    },
    {
      "id": 5,
      "pid": 4,
      "name": "2-1",
      "level": "2"
    },
    {
      "id": 6,
      "pid": 7,
      "name": "3-1",
      "level": "2"
    },
    {
      "id": 7,
      "pid": 0,
      "name": "3",
      "level": "1"
    }
  ]
}

代码

    // data[0]为原始数据
    var hash = {};
    var dataArr = [];
    for (let i = 0; i < data[0].length; i++) {
      hash[data[0][i].id] = data[0][i];
    }
    for (let i = 0; i < data[0].length; i++) {
      var aVal = data[0][i];
      var aValPar = hash[aVal['pid']];
      if (aValPar) {
        if (!aValPar.hasOwnProperty('children')) {
          aValPar['children'] = [];
          aValPar['children'].push(aVal);
        } else {
          aValPar['children'].push(aVal);
        }
      } else {
        dataArr.push(aVal);
      }
    }

照我的理解 这段代码第二个for循环 每次aValPar都会被重新赋值,那么它的children不就没有了么,而且我推入dataArr的数据都是aVal,在第二个循环中没有对于aVal变量进行children 赋值,为什么结果中就会有chilren字段呢

7 回复

一直想不通,js中都是值传递吧,为什么会修改到aVal的值。

没怎么仔细看代码

这里的aValPar 是一个object,看你的json里有多个pid=0的数据,假如第二个for循环第一次进来取到了第一个pid=0的数据,这时候是没有children,那么它就会给aValPar设置children,当循环再一次取到pid=0的时候,那么aValPar的值就是上一次取到的pid=0的json数据,即这时候aValPar是有children

还有 js中都是值传递吧 这句不对

数组和对象(其实数组也是对象)都是引用传值

在js里,数组和对象赋值给变量时。变量只是指向了这个数组和对象所在的内存。并不是新开辟一个内存。所以这时无论修改这个数组或者对象的值,还是修改变量的值,两边都会一起变化。

@imhered 谢谢,是我一直理解有错误

@foora 谢谢,原来我对于变量赋值的理解一直是错的

@wxs77577 谢谢,是我一直理解有错误

回到顶部