Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.05.2014, 11:43
Новичок на форуме
Отправить личное сообщение для Syndicate Посмотреть профиль Найти все сообщения от Syndicate
 
Регистрация: 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)
Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 08.05.2014, 12:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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.
Ответить с цитированием
  #3 (permalink)  
Старый 08.05.2014, 13:00
Новичок на форуме
Отправить личное сообщение для Syndicate Посмотреть профиль Найти все сообщения от Syndicate
 
Регистрация: 07.05.2014
Сообщений: 3

Мего! спасибо!

ЗЫ
За входные данные сорри.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу функцию для canvas, которая будет перемещать мой объект на позицию х,у eko24 Events/DOM/Window 0 12.10.2013 00:33
Создать объект в объекте Bryant-24 Общие вопросы Javascript 3 10.07.2013 16:06
jQuery (Как открыть объект в этом же окне, щёлкнув по нему мышкой) Объект кусок карты hadzhimuratov (X)HTML/CSS 32 18.06.2012 17:54
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37