Консоль дерева объектов JSON регистрируется в зависимости от глубины [плоскости JS] - PullRequest
0 голосов
/ 14 ноября 2018

Поэтому я пытаюсь получить консольный результат, подобный следующему:

LT 10
LT - Kaunas 2
LT - Kaunas - Centras 1
LT - Kaunas - Centras - lasives al. 0.5
LT - Kaunas - Žaliakalnis 1
LT - Vilnius 4

Из этого объекта JSON:

    var x = {
    "name": "LT",
    "size": 10,
    "nodes": [
        {
            "name": "Kaunas",
            "size": 2,
            "nodes": [
                {
                "name": "Centras",
                "size": 1,
                "nodes": [
                        {
                        "name": "lasives al.",
                        "size": 0.5,
                        "nodes": []
                        }
                    ]
                },
                {
                "name": "Žaliakalnis",
                "size": 1,
                "nodes": []
                }
            ]
        },
        {
            "name": "Vilnius",`enter code here`
            "size": 4,
            "nodes": []
        }
    ]
}

Мое решение просто повторяется через объект, но я не могу понять, как напечатать все в зависимости от глубины.

var name = [];

function Print(data) {
    for(var da in data) {
        if(data.hasOwnProperty(da) && typeof data[da] === 'object') {
            Print(data[da])
        } else {
            name.push(data[da]);
        }
    }
}

Print(x);

Пробовал, кажется, все, я думаю, это должно быть близко к одной строке кода, но не могу понять это. Недостаток знаний, кажется:)

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете взять массив в качестве данных и использовать замыкание по пути.

var data = { name: "LT", size: 10, nodes: [{ name: "Kaunas", size: 2, nodes: [{ name: "Centras", size: 1, nodes: [{ name: "lasives al.", size: 0.5, nodes: [] }] }, { name: "Žaliakalnis", size: 1, nodes: [] }] }, { name: "Vilnius", size: 4, nodes: [] }] };

[data].forEach(function iter(path) {
    return function ({ name, size, nodes }) {
        console.log(path.concat([name, size].join(' ')).join(' - '));
        nodes.forEach(iter(path.concat(name)));
    };
}([]));
0 голосов
/ 14 ноября 2018

Я бы использовал рекурсивную функцию, которая принимает строку префикса, см. Комментарии:

function render(obj, prefix = "") {
    // Show this object's information
    console.log(prefix + obj.name + " " + obj.size);
    // Add its name to the prefix
    prefix += obj.name + " - ";
    // Recurse for each of its nodes
    for (const node of obj.nodes) {
        render(node, prefix);
    }
}
render(x);

var x = {
    "name": "LT",
    "size": 10,
    "nodes": [
        {
            "name": "Kaunas",
            "size": 2,
            "nodes": [
                {
                "name": "Centras",
                "size": 1,
                "nodes": [
                        {
                        "name": "lasives al.",
                        "size": 0.5,
                        "nodes": []
                        }
                    ]
                },
                {
                "name": "Žaliakalnis",
                "size": 1,
                "nodes": []
                }
            ]
        },
        {
            "name": "Vilnius",
            "size": 4,
            "nodes": []
        }
    ]
};

function render(obj, prefix = "") {
    // Show this object's information
    console.log(prefix + obj.name + " " + obj.size);
    // Add its name to the prefix
    prefix += obj.name + " - ";
    // Recurse for each of its nodes
    for (const node of obj.nodes) {
        render(node, prefix);
    }
}
render(x);

Это использует некоторые функции ES2015 +, но версия ES5 очень похожа:

function render(obj, prefix) {
    prefix = prefix || "";
    console.log(prefix + obj.name + " " + obj.size);
    prefix += obj.name + " - ";
    obj.nodes.forEach(function(node) {
        render(node, prefix);
    });
}
render(x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...