Показать сообщение отдельно
  #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.
Ответить с цитированием