Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Алгоритм преобразования линейного массива в многомерный и наоборот (https://javascript.ru/forum/misc/37872-algoritm-preobrazovaniya-linejjnogo-massiva-v-mnogomernyjj-i-naoborot.html)

Shitbox2 12.05.2013 07:45

Алгоритм преобразования линейного массива в многомерный и наоборот
 
Посоветуйте быстрый алгоритм, который из такого массива:
[
    {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: []}
                ]
            }
        ]
    }
]

и наоборот

animhotep 12.05.2013 11:22

так этож разные масивы, где между ними связь?

Shitbox2 12.05.2013 11:50

Цитата:

Сообщение от animhotep (Сообщение 249973)
так этож разные масивы, где между ними связь?

pid — это идентификатор родителя. Так что зависимости они создают одни и те же

oneguy 12.05.2013 13:11

Вот преобразование в обе стороны.
//преобразование с 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));

Shitbox2 12.05.2013 19:15

Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?

oneguy 15.05.2013 16:23

Цитата:

Сообщение от Shitbox2 (Сообщение 250051)
Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?

Можно, но это не будет намного эффективнее.

PeaceCoder 15.05.2013 16:53

Цитата:

Сообщение от oneguy
Можно, но это не будет намного эффективнее.

В случае глубокой рекурсии будет

http://learn.javascript.ru/memory-ma...81%D1%82%D1%8C


Часовой пояс GMT +3, время: 22:24.