Как я могу проанализировать свой ввод, чтобы иметь структуру папок, например ответ

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

[
    {
        "id": "b45b8121-ea80-4ba5-970f-a963eadc0c8c",
        "name": "email",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "e4f41922-8657-49f0-9831-615bd7887f33",
            "b45b8121-ea80-4ba5-970f-a963eadc0c8c"
        ]
    },
    {
        "id": "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2",
        "name": "purpose",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "e4f41922-8657-49f0-9831-615bd7887f33",
            "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
            "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2"
        ]
    },
    {
        "id": "78e48433-0811-40d0-9b1f-c03a567eeaf9",
        "name": "usage",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "e4f41922-8657-49f0-9831-615bd7887f33",
            "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
            "78e48433-0811-40d0-9b1f-c03a567eeaf9"
        ]
    },
    {
        "id": "09956860-ae67-4458-b422-323c0adb82df",
        "name": "e164Number",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
            "09956860-ae67-4458-b422-323c0adb82df"
        ]
    },
    {
        "id": "e5249e27-58b5-4041-bc2d-e0cccf78cd80",
        "name": "number",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
            "e5249e27-58b5-4041-bc2d-e0cccf78cd80"
        ]
    },
    {
        "id": "a881cfca-2655-4270-a317-7a83d15c3b73",
        "name": "testArray",
        "idPathOfEntityToAttribute": [
            "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
            "676723c9-2795-406a-a775-d3294c095d6e",
            "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
            "a881cfca-2655-4270-a317-7a83d15c3b73"
        ]
    },

    {
        "id": "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
        "name": "companyInfo"
    },
    {
        "id": "676723c9-2795-406a-a775-d3294c095d6e",
        "name": "primaryContact"
    },
    {
        "id": "c30421e8-2d32-4810-aae9-7d1a6739b41b",
        "name": "contactInfo"
    },
    {
        "id": "e4f41922-8657-49f0-9831-615bd7887f33",
        "name": "emails"
    },
    {
        "id": "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
        "name": "variation"
    },
    {
        "id": "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
        "name": "phoneNumbers"
    }
]

  • Можно предположить, что последний пункт любого idPathOfEntityToAttribute массив — это атрибут «файл»

  • Все остальное, что находится выше последнего элемента, считается «папкой».

  • Те, у которых нет idPathOfEntityToAttribute, — это ссылки на папки.

  • Необходимо разместить каждый элемент в правильной папке

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

Я пробовал несколько подходов, таких как рекурсивные/простые функции сокращения, но безуспешно, я попробовал следующее:

const assignFolders = (
  dataMapNodes: DataMapSearchNode[],
  pathIds: string[],
  pathId: string,
  parentId?: string,
): DattaMapNodeInput | null => {
  if (pathIds.length === 0) {
    return null;
  }

  const currentDataNode = dataMapNodes.find((node) => node.id === pathId);
  const lastDomainId = pathIds[pathIds.length - 1];

  if (currentDataNode) {
    const newPathId = pathIds.slice(1);

    // const shareSameLastDomain = dataMapNodes.filter((dataMap) => {
    //   const currentPathId = dataMap.subAttributes?.idPathOfEntityToAttribute;
    //   if (currentPathId && currentPathId[currentPathId.length - 1] === lastDomainId) {
    //     return dataMap;
    //   }
    //   return null;
    // });

    const children = assignFolders(
      dataMapNodes,
      newPathId,
      newPathId[0],
      `${parentId}-sub-0`,
    );

    return {
      ...currentDataNode,
      id: `${parentId}-sub-0`,
      type: currentDataNode.dataMapType,
      name: currentDataNode.name,
      parentId,
      children: (children && [children]) || null,
    };
  }

  return null;
};

это ожидаемый результат:

[
  {
    "id": "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
    "name": "companyInfo",
    "children": [
      {
        "id": "676723c9-2795-406a-a775-d3294c095d6e",
        "name": "primaryContact",
        "children": [
          {
            "id": "c30421e8-2d32-4810-aae9-7d1a6739b41b",
            "name": "contactInfo",
            "children": [
              {
                "id": "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
                "name": "phoneNumbers",
                "children": [
                  {
                    "id": "09956860-ae67-4458-b422-323c0adb82df",
                    "name": "e164Number",
                    "idPathOfEntityToAttribute": [
                      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                      "676723c9-2795-406a-a775-d3294c095d6e",
                      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
                      "09956860-ae67-4458-b422-323c0adb82df"
                    ]
                  },
                  {
                    "id": "e5249e27-58b5-4041-bc2d-e0cccf78cd80",
                    "name": "number",
                    "idPathOfEntityToAttribute": [
                      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                      "676723c9-2795-406a-a775-d3294c095d6e",
                      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
                      "e5249e27-58b5-4041-bc2d-e0cccf78cd80"
                    ]
                  },
                  {
                    "id": "a881cfca-2655-4270-a317-7a83d15c3b73",
                    "name": "testArray",
                    "idPathOfEntityToAttribute": [
                      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                      "676723c9-2795-406a-a775-d3294c095d6e",
                      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
                      "a881cfca-2655-4270-a317-7a83d15c3b73"
                    ]
                  }
                ]
              }
            ]
          },
          {
            "id": "e4f41922-8657-49f0-9831-615bd7887f33",
            "name": "emails",
            "children": [
              {
                "id": "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
                "name": "variation",
                "children": [
                  {
                    "id": "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2",
                    "name": "purpose",
                    "idPathOfEntityToAttribute": [
                      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                      "676723c9-2795-406a-a775-d3294c095d6e",
                      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                      "e4f41922-8657-49f0-9831-615bd7887f33",
                      "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
                      "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2"
                    ]
                  },
                  {
                    "id": "78e48433-0811-40d0-9b1f-c03a567eeaf9",
                    "name": "usage",
                    "idPathOfEntityToAttribute": [
                      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                      "676723c9-2795-406a-a775-d3294c095d6e",
                      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                      "e4f41922-8657-49f0-9831-615bd7887f33",
                      "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
                      "78e48433-0811-40d0-9b1f-c03a567eeaf9"
                    ]
                  }
                ]
              },
              {
                "id": "b45b8121-ea80-4ba5-970f-a963eadc0c8c",
                "name": "email",
                "idPathOfEntityToAttribute": [
                  "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
                  "676723c9-2795-406a-a775-d3294c095d6e",
                  "c30421e8-2d32-4810-aae9-7d1a6739b41b",
                  "e4f41922-8657-49f0-9831-615bd7887f33",
                  "b45b8121-ea80-4ba5-970f-a963eadc0c8c"
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

Укажите ожидаемый результат для приведенного вами примера. Кроме того, не могли бы вы разделить основной абзац (то есть одно длинное предложение) на отдельные фразы?

trincot 08.03.2024 22:34

В своем редактировании также определите «текущий объект», и мы будем признательны, если вы сможете максимально сократить свой пример, сохранив при этом основные биты. Запрос trincot об ожидаемом результате — это то, что вы должны предоставлять всякий раз, когда приводите пример в вопросе.

Cary Swoveland 08.03.2024 22:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе Создание древовидного массива из плоского массива в JavaScript

Это несколько шагов процесса, комментарии в коде.

  1. Для простоты мы сортируем по самому длинному пути, чтобы мы могли создать правильный путь для наших родителей, у которых нет пути (они могут быть ссылками). Если порядок имеет значение, дайте мне знать.
  2. Для простоты мы создаем объект словаря для доступа к элементам по их идентификатору.
  3. Действительно, для каждого элемента мы сначала убеждаемся, что у каждого из его родителей также есть правильные родители (минус один).
  4. Теперь мы можем прикрепить каждый элемент к его родительскому узлу или к корню дерева.

var arr = [{
    "id": "b45b8121-ea80-4ba5-970f-a963eadc0c8c",
    "name": "email",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "e4f41922-8657-49f0-9831-615bd7887f33",
      "b45b8121-ea80-4ba5-970f-a963eadc0c8c"
    ]
  },
  {
    "id": "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2",
    "name": "purpose",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "e4f41922-8657-49f0-9831-615bd7887f33",
      "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
      "dc5b0d11-6e97-46f0-b9be-ecd4f9ab88d2"
    ]
  },
  {
    "id": "78e48433-0811-40d0-9b1f-c03a567eeaf9",
    "name": "usage",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "e4f41922-8657-49f0-9831-615bd7887f33",
      "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
      "78e48433-0811-40d0-9b1f-c03a567eeaf9"
    ]
  },
  {
    "id": "09956860-ae67-4458-b422-323c0adb82df",
    "name": "e164Number",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
      "09956860-ae67-4458-b422-323c0adb82df"
    ]
  },
  {
    "id": "e5249e27-58b5-4041-bc2d-e0cccf78cd80",
    "name": "number",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
      "e5249e27-58b5-4041-bc2d-e0cccf78cd80"
    ]
  },
  {
    "id": "a881cfca-2655-4270-a317-7a83d15c3b73",
    "name": "testArray",
    "idPathOfEntityToAttribute": [
      "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
      "676723c9-2795-406a-a775-d3294c095d6e",
      "c30421e8-2d32-4810-aae9-7d1a6739b41b",
      "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
      "a881cfca-2655-4270-a317-7a83d15c3b73"
    ]
  },

  {
    "id": "a12b7e26-6a50-422e-81a0-1c71598cdfb8",
    "name": "companyInfo"
  },
  {
    "id": "676723c9-2795-406a-a775-d3294c095d6e",
    "name": "primaryContact"
  },
  {
    "id": "c30421e8-2d32-4810-aae9-7d1a6739b41b",
    "name": "contactInfo"
  },
  {
    "id": "e4f41922-8657-49f0-9831-615bd7887f33",
    "name": "emails"
  },
  {
    "id": "5ed46c31-6349-4d38-8a6f-512dbfa3d28a",
    "name": "variation"
  },
  {
    "id": "ba03a1af-3a9a-466b-b5ec-8d744f620e66",
    "name": "phoneNumbers"
  }
]

function unflatten(arr) {
  var tree = []

  // sort by depth (leaves first)
  arr.sort(function(a, b) {
    var len_a = a.idPathOfEntityToAttribute ? a.idPathOfEntityToAttribute.length : 0
    var len_b = b.idPathOfEntityToAttribute ? b.idPathOfEntityToAttribute.length : 0
    return len_b - len_a
  })

  // group by id for easy access
  var grouped = arr.reduce(function(agg, item) {
    agg[item.id] = item
    item.children = []
    return agg;
  }, {})

  Object.keys(grouped).forEach(function(key) {
    var item = grouped[key];

    // make sure ancestors has correct idPathOfEntityToAttribute
    var path = [...item.idPathOfEntityToAttribute]
    var folder = path.pop()
    while (path.length) {
      folder = path.pop()
      grouped[folder].idPathOfEntityToAttribute = [...path, folder]
    }

    // attach to the tree or to the parent
    var len = item.idPathOfEntityToAttribute.length
    var parent_id = len > 1 ? item.idPathOfEntityToAttribute[len - 2] : null
    if (parent_id) {
      var parent = grouped[parent_id]
      if (!parent) {
        throw new Error("missing parent: " + parent_id + " - possible create it?")
      }
      parent.children.push(item);
    } else {
      tree.push(item)
    }
  })

  // optionally clean by removing idPathOfEntityToAttribute
  Object.keys(grouped).forEach(function(key) {
    var item = grouped[key];
    delete item.idPathOfEntityToAttribute
  })

  return tree;
}


var tree = unflatten(arr)

console.info(tree)
.as-console-wrapper {
  max-height: 100% !important;
  min-height: 100% !important;
}

Другие вопросы по теме

Неориентированный граф — кратчайший путь с вершиной и весом ребер
У меня проблема: я не могу решить проблему с группировкой Python
Помощь в форматировании и решении очень большой задачи о системе уравнений
AttributeError: объект типа «ortools.algorithms.python.knapsack_solver.KnapsackSolver» не имеет атрибута «KNAPSACK_DYNAMIC_PROGRAMMING_SOLVER»
Я пытался решить проблему переворачивания карточек с помощью рандомизированного алгоритма, но не могу получить ожидание каждого переворота
Подсчитать возрастающие группы для данного массива
Разделить граф на подграфы на основе атрибутов граничных вершин
Расчет продолжительности конфликтующих событий на временной шкале с производительностью в час
Почему встроенная функция sorted() работает медленнее для списка, содержащего числа по убыванию, если каждое число появляется дважды подряд?
Количество уникальных строк, которые можно сформировать путем обращения одной подстроки строки