У меня есть плановые данные и хочу комбинацию родительских детей. Angular - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующие данные:

1.[0 … 40]
1.  0:
      1.    id: "1"
      2.    type: "ABC"
      3.    description: " ABC "                       
2.  1: 
      1.    id: "2"
      2.    type: "ABC"
      3.    description: " ABC "
      4.    parentId: "1"
3.  2:
      1.    id: "3"
      2.    type: "ABC"
      3.    description: " ABC "                       
4.  3: 
      1.    id: "4"
      2.    type: "ABC"
      3.    description: " ABC "
5.  4: 
      1.    id: "5"
      2.    type: "ABC"
      3.    description: " ABC "
      4.    parentId: "4"

Я хочу следующий вывод:

1.  0:
    1.  children: 
        1.  id: "2"
        2.  type: "BDC"
        3.  description: " BCD "
        4.  parentId: "1"
2.  data:
        1.  id: "1"
        2.  type: "ABC"
        3.  description: " ABC "                       
2.  1: {data: {…}, children: Array(2)}
3.  2: {data: {…}, children: Array(2)}
4.  3: {data: {…}, children: Array(2)}

Используя Angular 8, и я хочу, чтобы эти форматы отображались в PrimeNg Tree Таблица

1 Ответ

0 голосов
/ 03 мая 2020
interface GroupedData {
  data: any;
  children: GroupedData[];
}

function groupData(originalArray: any[]): GroupedData[] {
  // Convert all elements for GroupedData shape in an object
  // having the id's as the keys
  const tempObj: { [id: string]: GroupedData } = array.reduce(
      (acc, item) =>
        (acc = { ...acc, [item.id]: { data: item, children: [] } }),
      {}
    );

  // put each child in the right parent's children array
  originalArray.forEach((item: any) => {
    if (item.parentId) {
      tempObj[item.parentId].children.push(tempObj[item.id]);
    }
  });

  // filter out all the GroupedData that has a valid data.parentId
  // and convert the final result to an array
  return Object.keys(tempObj)
      .map((key: string) => (tempObj[key].data.parentId ? null : tempObj[key]))
      .filter(Boolean);
}

Если вы хотите работать с более формальной типизированной структурой, опирающейся на ядро ​​языка, вы можете объявить tempObj как машинопись Map<string, GroupedData>:

function groupData(originalArray: any[]): GroupedData[] {
  // Convert all elements for GroupedData shape in a Map
  // having the id's as the keys
  const tempMap: Map<string, GroupedData> = new Map(
    originalArray.map(item => [item.id, { data: item, children: [] }])
  );

  // put each child in the right parent's children array
  originalArray.forEach((item: any) => {
    if (item.parentId) {
      tempMap.get(item.parentId).children.push(tempMap.get(item.id));
    }
  });

  // filter out all the GroupedData that has a valid data.parentId
  // and convert the final result to an array.
  // In ES6, you have some Array static methods, like Array.from()
  return Array.from(tempMap)
    .map(([key,value]) => (value.data.parentId ? null : value))
    .filter(Boolean);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...