使用Javascript (Underscore也是一个可行的解决方案),我如何遍历可以深入多个对象的复杂JSON对象(无数组)。
如何循环访问JSON对象并跟踪我所在的父/子层次结构中的哪个级别?
例如,我有以下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是动态的,因此没有设置结构,只是它是一个复杂的父/子JSON对象
我对递归函数很好,但是确定每个JSON键/值对的相对级别会让我感到沮丧。
如果需要更多信息,请告诉我。
提前致谢!
答案 0 :(得分:2)
你应该能够简单地使用一个带有对象和级别的函数来递归:
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
是从对象的根或第一个父对象开始,但这是一个简单的调整。两者都假设原始对象是树(即没有循环引用)。如果有循环引用,则需要跟踪您看到的对象。