Javascript - 递归循环,同时跟踪父子关系
Javascript - Recursive looping while keeping track of parent child relationships
使用Javascript (下划线也是一种可行的解决方案),如何循环遍历一个复杂的JSON对象(无数组)可以深入几个物体。
如何遍历 JSON 对象并跟踪我在 parent/child 层次结构中的哪个级别?
例如,我有以下 JSON:
{
'parent1': {
'name': 'something',
'children': {
'name': 'something else'
}
},
'parent2': {
'name': 'something',
'children': {
'name': 'something else',
'anotherProp': {
'name': 'whoa..something else'
}
}
},
}
最终,我想遍历并添加一个名为 'level' (例如 parent1.level) 的 属性。最高父级别是 0,下一个子级别是 1,等等。JSON 是动态的,因此没有固定结构,只是它是一个复杂的 parent/child JSON 对象。
我对递归函数没问题,但是确定每个 JSON key/val 对的相对水平让我感到困惑。
如果需要更多信息,请告诉我。
提前致谢!
您应该能够简单地使用带有对象和级别的函数进行递归:
var obj = {'parent1': {'name': 'something','children': { 'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}
function recurse(obj, level=0){
// add level
obj.level = level
Object.values(obj).map(v =>{
if (typeof v === 'object') {
// call again on children with increased level
recurse(v, level+1)
}
})
}
recurse(obj)
console.log(obj)
如果您不希望这是一个递归函数,您可以使用经典的广度优先搜索并在此过程中添加级别。类似于:
var obj = {'parent1': {'name': 'something','children': { 'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}
function addLevel(obj){
obj.level = 0
// will be FIFO queue
let queue = [obj]
while(queue.length){
let o = queue.shift();
Object.values(o).forEach(item => {
if (typeof item === 'object'){
// level will be one more than parent
item.level = o.level +1
queue.push(item)
}
});
}
}
addLevel(obj)
console.log(obj)
我不确定您的 level: 0
是从对象的根还是第一个父对象开始,但这是一个简单的调整。两者都假设原始对象是一棵树(即没有循环引用)。如果有循环引用,您将需要跟踪您看到的对象。
使用Javascript (下划线也是一种可行的解决方案),如何循环遍历一个复杂的JSON对象(无数组)可以深入几个物体。
如何遍历 JSON 对象并跟踪我在 parent/child 层次结构中的哪个级别?
例如,我有以下 JSON:
{
'parent1': {
'name': 'something',
'children': {
'name': 'something else'
}
},
'parent2': {
'name': 'something',
'children': {
'name': 'something else',
'anotherProp': {
'name': 'whoa..something else'
}
}
},
}
最终,我想遍历并添加一个名为 'level' (例如 parent1.level) 的 属性。最高父级别是 0,下一个子级别是 1,等等。JSON 是动态的,因此没有固定结构,只是它是一个复杂的 parent/child JSON 对象。
我对递归函数没问题,但是确定每个 JSON key/val 对的相对水平让我感到困惑。
如果需要更多信息,请告诉我。
提前致谢!
您应该能够简单地使用带有对象和级别的函数进行递归:
var obj = {'parent1': {'name': 'something','children': { 'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}
function recurse(obj, level=0){
// add level
obj.level = level
Object.values(obj).map(v =>{
if (typeof v === 'object') {
// call again on children with increased level
recurse(v, level+1)
}
})
}
recurse(obj)
console.log(obj)
如果您不希望这是一个递归函数,您可以使用经典的广度优先搜索并在此过程中添加级别。类似于:
var obj = {'parent1': {'name': 'something','children': { 'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}
function addLevel(obj){
obj.level = 0
// will be FIFO queue
let queue = [obj]
while(queue.length){
let o = queue.shift();
Object.values(o).forEach(item => {
if (typeof item === 'object'){
// level will be one more than parent
item.level = o.level +1
queue.push(item)
}
});
}
}
addLevel(obj)
console.log(obj)
我不确定您的 level: 0
是从对象的根还是第一个父对象开始,但这是一个简单的调整。两者都假设原始对象是一棵树(即没有循环引用)。如果有循环引用,您将需要跟踪您看到的对象。