08.05.2014, 11:43
|
Новичок на форуме
|
|
Регистрация: 07.05.2014
Сообщений: 3
|
|
Преобразование масива в объект (дерево)
Необходимо преобразовать мас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)
Спасибо!
|
|
08.05.2014, 12:36
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
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);
__________________
29375, 35
Последний раз редактировалось Aetae, 08.05.2014 в 12:57.
|
|
08.05.2014, 13:00
|
Новичок на форуме
|
|
Регистрация: 07.05.2014
Сообщений: 3
|
|
Мего! спасибо!
ЗЫ
За входные данные сорри.
|
|
|
|