Преобразование плоской строки JSON в иерархическую форму с использованием родительского идентификатора - PullRequest
0 голосов
/ 10 апреля 2020

Я использую Mat-Tree, используя Angular Материал. У меня есть плоская строка JSON, например:

"Entity": [
  {
      "ID": 1,
      "NAME": "Reports",
      "PARENTID": "0",
      "ISACTIVE": "Y",
      "CREATIONDATE": "2020-03-31T15:08:11",
      "UPDATIONDATE": "2020-03-31T15:08:11",
      "CREATEDBY": 596241,
      "UPDATEDBY": 596241
  },
  {
      "ID": 2,
      "NAME": "TMS - Reports",
      "PARENTID": 1,
      "ISACTIVE": "Y",
      "CREATIONDATE": "2020-03-31T15:08:38",
      "UPDATIONDATE": "2020-03-31T15:08:38",
      "CREATEDBY": 596241,
      "UPDATEDBY": 596241
  },
  {
      "ID": 3,
      "NAME": "TMS - Beneficiary ",
      "PARENTID": 2,
      "ISACTIVE": "Y",
      "CREATIONDATE": "2020-03-31T15:09:34",
      "UPDATIONDATE": "2020-03-31T15:09:34",
      "CREATEDBY": 596241,
      "UPDATEDBY": 596241
  }
]

, и мне нужно преобразовать ее в пары ключ-значение на основе идентификатора родителя. Что-то вроде:

{
    Reports: 
    {
      'Type 1 Reports': ['Beneficiary Reports', 'Some Other Report'],
      'Type 2 Reports': null //No Children,
    },

    Some Other Menu Items: {
     'My Parent Node': null,
      'Some Other Menu Node': ['Child 1', 'Child 2']
   } 

}

Пока что я могу использовать этот код для преобразования его в иерархию «родитель-потомок», но он вытолкнул всех потомков в массив Items, который я не могу перебрать с помощью Mat-Tree. Мне нужно избавиться от предметов и получить что-то вроде пары ключ-значение, как я упомянул выше:

    generateTreeData(menuResponse)
    { 

    var map = {};
    for(var i = 0; i < menuResponse.length; i++){
      var obj = menuResponse[i];
      var parent = '';
      obj.items= [];
      map[obj.ID] = obj;
      if(obj.PARENTID  == "0")
      {
        parent = '-';
      }
      else
      {
        parent = obj.PARENTID;
      }
      if(!map[parent]){
        //Means Parent doesnt exist i.e. node Itself is parent node
          map[parent] = {
             items: []         
            };
      }
       map[parent].items.push(obj);  
    }
    return map['-'].items;
  }

Проблема:

Код ставит дочерние узлы в массиве Items. Мне нужно избавиться от массива Items и поместить его в пары ключ-значение, подобные той, что я упоминал выше. Как мне просто извлечь "ИМЯ" и элементы из этого массива JSON и создать пару ключ-значение? Что-то вроде того, что я упомянул выше?

1 Ответ

0 голосов
/ 10 апреля 2020

Ожидаемая структура вывода не выглядит правильно. Что делать, если есть дочерний элемент для узла «Отчеты получателя».

Структура вывода для ввода, представленного в вопросе, должна выглядеть следующим образом:

{
   "Reports":[
      {
         "TMS - Reports":[
            {
               "TMS - Beneficiary ":[]
            }
         ]
      }
   ]
}

Проверьте следующую скрипту: https://jsfiddle.net/abby_7700/apkgeo1d/3/

var data = [];//your response goes here
var result = {};
var root = data.find(x => x.PARENTID == 0);
result[root.NAME] = [];

findAndAddChildren(root.ID, result[root.NAME]);
console.log(JSON.stringify(result));

function findAndAddChildren(parentID, collection) {
    var rootChildren = data.filter(x => x.PARENTID == parentID);
    for(var i = 0; i < rootChildren.length; i++) {
    var child = rootChildren[i];
    var temp = {};
    temp[child.NAME] = [];
    collection.push(temp);
    findAndAddChildren(child.ID, temp[child.NAME]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...