Как создать древовидную структуру из объекта JavaScript - PullRequest
0 голосов
/ 16 ноября 2018

Это пример объекта, который мне дали:

Ввод:

{"People": [{"id": "12", "parentId": "0 "," text ":" Man "," level ":" 1 "," children ": null}, {" id ":" 6 "," parentId ":" 12 "," text ":" Boy ", "level": "2", "children": null}, {"id": "7", "parentId": "12", "text": "Other", "level": "2", "children ": null}, {" id ":" 9 "," parentId ":" 0 "," text ":" Woman "," level ":" 1 "," children ": null}, {" id ": "11", "parentId": "9", "text": "Girl", "level": "2", "children": null}]}

Я хочу преобразоватьэто в формате JSON, например:

{
    "People": [
        {
            "id": "12",
            "parentId": "0",
            "text": "Man",
            "level": "1",
            "children": [
                {
                    "id": "6",
                    "parentId": "12",
                    "text": "Boy",
                    "level": "2",
                    "children": null
                },
                {
                    "id": "7",
                    "parentId": "12",
                    "text": "Other",
                    "level": "2",
                    "children": null
                }   
            ]
        }
}

Любые идеи / помощь будут оценены

Ответы [ 2 ]

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

Вы можете использовать объект для ссылки на ребенка или родителя и собирать детей и родителей, чтобы получить только человека для корня.

var data = { John: "James", Samar: "Michel", Albert: "Michel", Michel: "James", James: "Sarah" },
    parents = new Set,
    children = new Set,
    references = {},
    result;

Object
    .entries(data)
    .forEach(([child, parent]) => {
        references[child] = references[child] || [];
        references[parent] = references[parent] || [];
        references[parent].push({ [child]: references[child] });
        parents.add(parent);
        children.add(child);
    });

result = [...parents]
    .filter(p => !children.has(p))
    .map(p => ({ [p]: references[p] }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 16 ноября 2018

О боже, эта, казалось бы, простая штука заняла так много времени

const users = {
        "John": "James",
        "Samar": "Michel",
        "Albert": "Michel",
        "Michel": "James",
        "James": "Sarah"
    }
    
    const findRoots = () => Object.keys(users).filter(k => !(users[k] in users)).map(k => users[k])
    
    const findSubordinates = (boss) => Object.keys(users).filter(k => users[k] === boss)
    
    const traverseBoss = (boss) => {
        let subs = findSubordinates(boss)
    
        let subsCollection = []
    
        subs.forEach(s => {
            subsCollection.push({
                [s]: traverseBoss(s)
            })
        })
    
        return subsCollection
    }
    
    
    const result = {}
    findRoots().forEach(root => result[root] = traverseBoss(root))
    
    console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...