Показать сообщение отдельно
  #1 (permalink)  
Старый 25.04.2017, 17:37
Новичок на форуме
Отправить личное сообщение для pzyryanov Посмотреть профиль Найти все сообщения от pzyryanov
 
Регистрация: 25.04.2017
Сообщений: 4

Создание многоуровневого меню из объекта
Здравствуйте, уважаемые форумчане. Требуется помощь в создание многоуровневого меню. Имеется следующие данные в js.
"tags": {
        "language": {
            "parent": {
                "button": {
                    "parent": {
                        "home": {
                            "parent": null
                        }
                    }
                }
            }
        },
        "meta": { "parent": ["user", "required_fields", "button"] },
        "button": { "parent": ["meta", "statistics", "home"] },
        "user":{"parent": "home"},
        "required_fields":{"parent":null},
        "transactions":{"parent":null},
        "statistics":{"parent":null},
        "home":{"parent":null}
    }

Требуется по этим данным, создать меню, учитывающее вложенность до 3-го уровня. Как вижу решение данной задачи.
Пункт1. Сначала "развернуть" данные пункты меню и создать цепочку из child, взамен parent'ов примерно такого вида:
"tags": {
        "home": {
            "child": {
                "button": {
                    "child": {
                        "language": {
                            "child": null
                        }
                    }
                }     
            }
        },
        "user": { "child":  "meta"}
    }

Пункт 2. По этой цепочке с помощью рекурсивной функции построить список и вставить в DOM-структуру в необходимом месте.
Что на данный момент уже реализовал.
Пункт 1:
//объявляю переменную с входными данными
var tags = json.tags;
//создаю пустой объект, где будет храниться структурированные данные
var tag_str = {};
function ref(tags, x, y)  {
    for (key in tags) {
        console.log('key=', tags[key].parent);
        //если parent null, то создаю ключ в новой структуре со значением null
        if (tags[key].parent == null)  {
            tag_str[key] = null;
        // рассматриваю случай, когда parent является массивом
        } else if (tags[key].parent instanceof Array)  {
            //пробегаю по всем элементам массива
            //и создаю объекты в новой структуре, где переназначаю свойства с parent на  child
            for (var i = 0; i < tags[key].parent.length; i++) {
                if (typeof tag_str[tags[key].parent[i]] == "object" && !(tag_str[tags[key].parent[i]] instanceof Array))  {
                    if (tag_str[tags[key].parent[i]] && typeof tag_str[tags[key].parent[i]].child == "object" && !( tag_str[tags[key].parent[i]].child instanceof Array ) )  {
                        tag_str[tags[key].parent[i]].child[key] = null;
                }  else  {
                        tag_str[tags[key].parent[i]] = {};
                        tag_str[tags[key].parent[i]].child = {};
                        tag_str[tags[key].parent[i]].child[key] = null;
                    }
                }  else  {
                    tag_str[tags[key].parent[i]] = {};
                   if (typeof tag_str[tags[key].parent[i]].child == "object" && !(tag_str[tags[key].parent[i]].child instanceof Array))  {
                       tag_str[tags[key].parent[i]].child[key] = null;
                   } else {
                       tag_str[tags[key].parent[i]].child = {};
                       tag_str[tags[key].parent[i]].child[key] = null;
                   }
                }
            }
        //рассматриваю случай, когда parent объект
        } else if (typeof tags[key].parent == "object" && !(tags[key].parent instanceof Array))  {
            if (tags[key].parent !== null) {
        // x вводится для учёта вложенности новой структуры
                if(x)  {
                        tag_str[key] = {};
                        tag_str[key].child = {};
                        tag_str[key].child[x] = null;
                        ref(tags[key].parent, x);
                }
                else  {
                    tag_str[tags[key].parent] = {};
                    tag_str[tags[key].parent].child = {};
                    tag_str[tags[key].parent].child = null;
                    console.log('приехали');
                    var x = key;
                    ref(tags[key].parent, x);
                }
            }
            else  {
                console.log('parent null');
            }
        }
    } 
}

Пункт 2.
ref(tags);
var tags = json.tags;
function rec(tag_str, c) {
    var str = '';
    for (key in tag_str) {
        if (tag_str[key].child == null)  {
            str += rec(tag_str[key].child);
            str += '<ul><li>' + key ;
            delete tag_str[key];
        }  
        else {
            if (typeof tag_str[key].child == 'object' && !tag_str[key].child instanceof Array)  {
                str += rec(tag_str[key].child);
                str += '<li>' + key;
                // delete tag_str[key];
            }
            if (tag_str[key].parent instanceof Array)  {
                for (var i = 0; i < tag_str[key].child.length; i++) {
                    str += '<li>' + tag_str[key].child[i];
                    // delete tag_str[key][i];
                }
                str += rec(tag_str[key].child);
                // delete tags[key];
            }
        }
    }
    str += '</li>'
    str += '</ul>';
    return str;
}

В итоге строится структура. Для массивов всё создается вроде как нормально, но для объектов не учитывается вложенность. Возможно всё делается проще и не нужно такое нагромождение условий. Буду благодарен за помощь в решение данной задачи.
Ответить с цитированием