Создайте массив json из вложенного дерева json

Я пишу код, в котором у меня есть вложенное генеалогическое древо, и я хочу создать массив JSON с тем же. В настоящее время я могу получить родительское значение во вновь созданном JSON, но я ищу способ получить идентификатор предка.

Вот мой код. Введите код здесь

const myObj = {
  id: 1,
  children: [
    {
      id: 2,
      children: [
        {
          id: 3,
        },
      ],
    },
    {
      id: 4,
      children: [
        {
          id: 5,
          children: [
            {
              id: 6,
              children: [
                {
                  id: 7,
                },
              ],
            },
          ],
        },
      ],
    },
  ],
};

idArray = [];

function func(obj, parent) {
  idArray.push({
    id: obj.id,
    name: `${obj.id} ${parent ? `child of ${parent}` : ""}`,
    parentId: parent
  });
  if (!obj.children) {
    return;
  }
  obj.children.forEach((child) => func(child, obj.id));
}

func(myObj);
console.info(idArray);

Здесь под parent Я хочу новый ключ grandparent, который показывает идентификатор дедушки и бабушки. Пожалуйста, дайте мне знать, как я могу это получить. А также есть ли способ получить результат без использования глобальной переменной, просто перебирая данные и возвращая окончательный массив? как console.info(JSON.stringify(func(myObj))).

Спасибо

Пожалуйста, добавьте желаемый результат.

0stone0 18.04.2023 14:55
Поведение ключевого слова "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
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Как правило, если вы хотите отслеживать более одного предка, B-Tree — идеальный способ управления этим. Гораздо проще найти родителя любого узла на любом уровне.

Вот ресурс, где вы можете узнать больше о B-деревьях. Построение B-дерева в JavaScript

Вы должны проверять и оперировать каждого ребенка на ребенка. Если у ребенка есть дети, то вы должны вспомнить ту же функцию.

См. функцию «поиск» ниже.

const myObj = {
  id: 1,
  name: '11',
  children: [...]
};

const finder = function (child, tempArray, parentId = 0){
    tempArray.push({id:child.id, name: child.name, parentId });

    if (child.children)
    {
        child.children.forEach(grandChild => finder(grandChild,tempArray,child.id)); // here is trick
    }
}

const fixer = function(firstObject){
    let idArray = [];
    finder(firstObject,idArray);
    return idArray;
}

const newArray = fixer(myObj);
console.info(newArray);

выход

[
  { id: 1, name: '11', parentId: 0 },
  { id: 2, name: '22', parentId: 1 },
  { id: 3, name: '33', parentId: 2 },
  { id: 4, name: '44', parentId: 1 },
  { id: 5, name: '55', parentId: 4 },
  { id: 6, name: '66', parentId: 5 },
  { id: 7, name: '77', parentId: 6 }
]

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