Преобразование масива в объект (дерево)
Необходимо преобразовать масcив (JSON) в объект (дерево).
Для этого нужна функция :) Побывал рекурсивно не получилось... Входящий масив (порядок может быть различным...) var data = [ { "role_id": "1", "parent_id": "0", "name": "guest" }, { "role_id": "3", "parent_id": "2", "name": "user" }, { "role_id": "4", "parent_id": "0", "name": "admin" }, { "role_id": "5", "parent_id": "8", "name": "mt" }, { "role_id": "6", "parent_id": "3", "name": "teacher" }, { "role_id": "7", "parent_id": "3", "name": "headteacher" }, { "role_id": "8", "parent_id": "3", "name": "wall" }, { "role_id": "14", "parent_id": "3", "name": "student" }, { "role_id": "15", "parent_id": "14", "name": "individual" }, { "role_id": "18", "parent_id": "14", "name": "group" }, { "role_id": "19", "parent_id": "16", "name": "mt2" }, { "role_id": "25", "parent_id": "5", "name": "mt3" }, { "role_id": "30", "parent_id": "8", "name": "operator" }, { "role_id": "31", "parent_id": "8", "name": "translator" }, { "role_id": "32", "parent_id": "8", "name": "root" }, { "role_id": "33", "parent_id": "8", "name": "comment editor" }, { "role_id": "34", "parent_id": "8", "name": "finance" }, { "role_id": "35", "parent_id": "30", "name": "finance1" } ]; Новый объект (дерево) строиться по принципу - первый элемент в дереве parent_id == 0 - последущие parent_id == предыдущему role_id Пример [ { "role_id": "1", "parent_id": "0", "name": "guest", children: [ { "role_id": "2", "parent_id": "1", "name": "viewer" children: [ { "role_id": "3", "parent_id": "2", "name": "user", children: [ { "role_id": "6", "parent_id": "3", "name": "teacher" }, { "role_id": "7", "parent_id": "3", "name": "headteacher" }, { "role_id": "8", "parent_id": "3", "name": "wall", children: [ { "role_id": "30", "parent_id": "8", "name": "operator" } ] }, { "role_id": "14", "parent_id": "3", "name": "student", children: [ { { "role_id": "15", "parent_id": "14", "name": "individual" }, { "role_id": "18", "parent_id": "14", "name": "group" } } ] } ] } ] } ] }, { "role_id": "4", "parent_id": "0", "name": "admin" }, ] Это необходимо для постройки дерева в extjs 4 (treepanel) Спасибо! |
Syndicate,
Толи пример входящего массива кривой(нет связи меж дваумя верхними объектами и остальными нижними), толи мы должны как-то сами придумать { "role_id": "2", "parent_id": "1", "name": "viewer" } Скрипт с поправленными входными данными: var data = [ { "role_id": "1", "parent_id": "0", "name": "guest" }, { "role_id": "3", "parent_id": "2", "name": "user" }, { "role_id": "4", "parent_id": "0", "name": "admin" }, { "role_id": "5", "parent_id": "8", "name": "mt" }, { "role_id": "2", "parent_id": "1", "name": "viewer" }, { "role_id": "6", "parent_id": "3", "name": "teacher" }, { "role_id": "7", "parent_id": "3", "name": "headteacher" }, { "role_id": "8", "parent_id": "3", "name": "wall" }, { "role_id": "14", "parent_id": "3", "name": "student" }, { "role_id": "15", "parent_id": "14", "name": "individual" }, { "role_id": "18", "parent_id": "14", "name": "group" }, { "role_id": "25", "parent_id": "5", "name": "mt3" }, { "role_id": "30", "parent_id": "8", "name": "operator" }, { "role_id": "31", "parent_id": "8", "name": "translator" }, { "role_id": "32", "parent_id": "8", "name": "root" }, { "role_id": "33", "parent_id": "8", "name": "comment editor" }, { "role_id": "34", "parent_id": "8", "name": "finance" }, { "role_id": "35", "parent_id": "30", "name": "finance1" } ]; function convert(data){ var result = [], temp = {}, i = data.length, j=i; while(i--) temp[data[i].role_id] = data[i]; for(i = 0; i<j; i++){ if(data[i].parent_id == "0"){ result.push(data[i]); continue; } var parent = temp[data[i].parent_id]; if(!parent.children) parent.children = []; parent.children.push(data[i]) } return result } var result = convert(data); alert(JSON.stringify(result,null,' ')); console.log(result); |
Мего! спасибо!
ЗЫ За входные данные сорри. |
Часовой пояс GMT +3, время: 15:41. |