我在网上找了一段代码来转换,结果是符合要求的,但是代码一直看不懂,望社区朋友帮忙解释 原始数据 也就是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字段呢
一直想不通,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 谢谢,是我一直理解有错误