Конвертировать массив объектов с родительскими / дочерними отношениями в массив вложенных объектов - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с преобразованием массива объектов в другой массив вложенных объектов.Как я могу преобразовать table, чтобы он выглядел как transformedTable в приведенном ниже примере кода?

Входные данные:

const table = [
  {id: 1, isMain: null, parentId: null, name:"john"},
  {id: 2, isMain: true, parentId: null, name:"sam"},
  {id: 3, isMain: null, parentId: 2, name:"samantha"},
  {id: 4, isMain: true, parentId: null, name:"kate"},
  {id: 5, isMain: true, parentId: 4, name:"jonathan"},
  {id: 6, isMain: null, parentId: 4, name:"walter"},
  {id: 7, isMain: null, parentId: 5, name:"clara"}
]

Я хочу преобразовать данные выше в нечто вроде этого:

transformedTable = [{
    id: 1,
    isMain: null,
    parentId: null,
    name: "john"
  },
  {
    id: 2,
    isMain: true,
    parentId: null,
    name: "sam",
    kids: [{
      id: 3,
      isMain: null,
      parentId: 2,
      name: "samantha"
    }]
  },
  {
    id: 4,
    isMain: true,
    parentId: null,
    name: "kate",
    kids: [{
        id: 5,
        isMain: true,
        parentId: 4,
        name: "jonathan",
        kids: [{
          id: 7,
          isMain: null,
          parentId: 5,
          name: "clara"
        }]
      },
      {
        id: 6,
        isMain: null,
        parentId: 4,
        name: "walter"
      },
    ]
  },
]

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете вложить пару циклов, чтобы сравнить каждый объект и добавить свойство "kids", где это необходимо.Затем отфильтруйте полученный массив, чтобы оставить только конечных родителей (которые содержат все вложенные дочерние элементы).Смотрите рабочий фрагмент ниже:

const table = [
  {id: 1, isMain: null, parentId: null, name:"john"},
  {id: 2, isMain: true, parentId: null, name:"sam"},
  {id: 3, isMain: null, parentId: 2, name:"samantha"},
  {id: 4, isMain: true, parentId: null, name:"kate"},
  {id: 5, isMain: true, parentId: 4, name:"jonathan"},
  {id: 6, isMain: null, parentId: 4, name:"walter"},
  {id: 7, isMain: null, parentId: 5, name:"clara"}
];

const kid = (p, c) => {
  if (p.hasOwnProperty('kids')) {
    p.kids.push(c);
  } else {
    p.kids = [c];
  }  
}

for (let i = 0; i < table.length - 1; i++) {
  let a = table[i];
  for (let j = i + 1; j < table.length; j++) {
    let b = table[j];
    if (a.id === b.parentId) {
      kid(a, b);
    } else if (b.id === a.parentId) {
      kid(b, a);
    }
  }
}

let result = table.filter(x => !x.parentId);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...