Объект в дереве для TreeTable, дважды сгруппируйте Typescript/JavaScript

Я пытаюсь преобразовать список в древовидную структуру для Primeng TreeTable.

[{pk:"1", corpID:"1234", date: "31/03/21", rela:"4325", price:"20.00"},
{pk:"2", corpID:"1234", date: "21/03/21", rela:"4425", price:"50.00"} ,
{pk:"3", corpID:"3456", date: "03/03/21", rela:"6327", price:"80.00"} ,
{pk:"4", corpID:"4567", date: "05/03/21", rela:"7328", price:"40.00"}]

Мне нужно сгруппировать данные дважды, сначала по corpId, а затем по rela. PrimeNG TreeTable использует data и children - данные будут значением, показанным в строке, а дочерние элементы будут данными в развернутой строке. https://www.primefaces.org/primeng/showcase/#/treetable Структура должна быть:

{ data : [
    
        { 
            data: {
                corpID : "1234"
                },
                children: [
                   {
                   data:{ 
                     RELA: "4325"
                },
                children: [
                        {
                        data : { pk:"1",
                                 corpID:"1234",
                                 date: "31/03/21", 
                                 rela:"4325",
                                 price:"20.00"},
                        }]
                 },
                data:{ 
                   RELA: "4425"
                },
                children: [
                        {
                               { pk:"2", 
                                 corpID:"2345",
                                 date: "21/03/21",
                                 rela:"4425", 
                                 price:"50.00"
                         }
                       ]
...

Я пробовал группировать и использовать функцию сокращения, хотя она создала правильную древовидную структуру, но сжала данные. Есть ли способ построить древовидную структуру, включив в нее атрибуты data и children? Любая помощь будет принята с благодарностью! Функция, которую я попробовал ниже, уменьшила данные, и я не знал, как добавить в data и children

  let result  = this.data.reduce(this.totree, {}); 

 totree(branches, node) {

    if (!branches[node.corpId]) {
      branches[node.corpId] = {};
    }
    branches[node.corpId][node.rela] = node;
    branches[node.corpId][node.rela] = Object.assign(branches[node.corpId][node.rela]);
    return branches;
  }

person annaM    schedule 31.03.2021    source источник


Ответы (1)


Я только что написал и протестировал этот код для вас, я считаю, что его можно лучше реорганизовать, но самое главное, что он может достичь той же структуры, которую вы хотели.

const arr = [
  { pk: "1", corpID: "1234", date: "31/03/21", rela: "4325", price: "20.00" },
  { pk: "2", corpID: "1234", date: "21/03/21", rela: "4425", price: "50.00" },
  { pk: "3", corpID: "3456", date: "03/03/21", rela: "6327", price: "80.00" },
  { pk: "4", corpID: "4567", date: "05/03/21", rela: "7328", price: "40.00" },
];

const groupBy = (arrayInput, key) => {
  return arrayInput.reduce(
    (r, v, i, a, k = v[key]) => ((r[k] || (r[k] = [])).push(v), r),
    {}
  );
};

const groupedByCorpID = groupBy(arr, "corpID");

const ans = Object.entries(groupedByCorpID).map(([key, value]) => {
  const groupedByRela = groupBy(value, "rela");

  const children = Object.entries(groupedByRela).map(
    ([childKey, childValue]) => {
      return {
        data: { RELA: childKey },
        children: childValue,
      };
    }
  );

  return { data: { corpID: key }, children };
});

person Waelsy123    schedule 31.03.2021