Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.05.2013, 07:45
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Алгоритм преобразования линейного массива в многомерный и наоборот
Посоветуйте быстрый алгоритм, который из такого массива:
[
    {id: 1, pid: null},
    {id: 2, pid: null},
    {id: 3, pid: 5},
    {id: 4, pid: 5},
    {id: 5, pid: 2}
]

сделает такой:
[
    {id: 1, child: []},
    {id: 2, child:
        [
            {id: 5, child:
                [
                    {id: 4, child: []},
                    {id: 3, child: []}
                ]
            }
        ]
    }
]

и наоборот

Последний раз редактировалось Shitbox2, 12.05.2013 в 11:49.
Ответить с цитированием
  #2 (permalink)  
Старый 12.05.2013, 11:22
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 17.01.2013
Сообщений: 887

так этож разные масивы, где между ними связь?
Ответить с цитированием
  #3 (permalink)  
Старый 12.05.2013, 11:50
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Сообщение от animhotep Посмотреть сообщение
так этож разные масивы, где между ними связь?
pid — это идентификатор родителя. Так что зависимости они создают одни и те же
Ответить с цитированием
  #4 (permalink)  
Старый 12.05.2013, 13:11
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Вот преобразование в обе стороны.
//преобразование с 1-го представления во 2-ой
function trans(arr) {
  var b=[], res=[];
  for (var i=0; i<arr.length; i++)
    b[arr[i].id]={
      id: arr[i].id,
      child: []
    };
  for (i=0; i<arr.length; i++) {
    if (arr[i].pid==null)
      res.push(b[arr[i].id]);
    else b[arr[i].pid].child.push(b[arr[i].id]);
  }
  return res;
}
/*обратное преобразование, используется рекурсия.
Предполагается, что структура является деревом (не циклическая)*/
function revTrans(arr) {
  var res=[];
  (function _revTrans(arr, pid) {
    for (var i=0; i<arr.length; i++) {
      res.push({
        id: arr[i].id,
        pid: pid
      });
      _revTrans(arr[i].child, arr[i].id);
    }
  })(arr, null);
  return res;
}
//тест
var arr=[
    {id: 1, pid: null},
    {id: 2, pid: null},
    {id: 3, pid: 5},
    {id: 4, pid: 5},
    {id: 5, pid: 2}
];
var arr2=trans(arr);
alert(JSON.stringify(arr2, undefined, 2));
alert(JSON.stringify(revTrans(arr2), undefined, 2));

Последний раз редактировалось oneguy, 12.05.2013 в 13:32.
Ответить с цитированием
  #5 (permalink)  
Старый 12.05.2013, 19:15
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?
Ответить с цитированием
  #6 (permalink)  
Старый 15.05.2013, 16:23
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от Shitbox2 Посмотреть сообщение
Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?
Можно, но это не будет намного эффективнее.
Ответить с цитированием
  #7 (permalink)  
Старый 15.05.2013, 16:53
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от oneguy
Можно, но это не будет намного эффективнее.
В случае глубокой рекурсии будет

http://learn.javascript.ru/memory-ma...81%D1%82%D1%8C
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить алгоритм и программу для решения следующей задачи. Даны два массива X (5), rjabijj Общие вопросы Javascript 2 05.07.2012 22:02