Javascript - рекурсивный цикл с отслеживанием родительских и дочерних отношений - PullRequest
0 голосов
/ 30 апреля 2018

Использование 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 вызывает у меня атм.

Дайте мне знать, если потребуется дополнительная информация.

Заранее спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Вы должны иметь возможность просто выполнить рекурсию с помощью функции, которая берет объект и уровень:

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 начинается с корня объекта или первого родителя, но это простая настройка. Оба предполагают, что исходный объект является деревом (т.е. без циклических ссылок). Если есть круговые ссылки, вам необходимо отслеживать, какие объекты вы видели.

...