12.05.2013, 07:45
|
Профессор
|
|
Регистрация: 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.
|
|
12.05.2013, 11:22
|
|
Профессор
|
|
Регистрация: 17.01.2013
Сообщений: 887
|
|
так этож разные масивы, где между ними связь?
|
|
12.05.2013, 11:50
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Сообщение от animhotep
|
так этож разные масивы, где между ними связь?
|
pid — это идентификатор родителя. Так что зависимости они создают одни и те же
|
|
12.05.2013, 13:11
|
Профессор
|
|
Регистрация: 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.
|
|
12.05.2013, 19:15
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?
|
|
15.05.2013, 16:23
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от Shitbox2
|
Спасибо! Я, кстати, в первом случае рекурсией делал. Интересно, можно второй способ итерациями сделать?
|
Можно, но это не будет намного эффективнее.
|
|
15.05.2013, 16:53
|
|
Профессор
|
|
Регистрация: 15.12.2009
Сообщений: 742
|
|
Сообщение от oneguy
|
Можно, но это не будет намного эффективнее.
|
В случае глубокой рекурсии будет
http://learn.javascript.ru/memory-ma...81%D1%82%D1%8C
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
|
|
|
|