Преобразование вложенного Json в плоский Json с parentId для каждого узла

Следующая структура Json является результатом apoc-запроса Neo4J. Я хочу преобразовать этот вложенный Json в плоскую структуру Json, как показано во втором файле json.

[
    {
      "child1": [
        {
          "_type": "EntityChild1",
          "name": "Test222",
          "_id": 2
        }
      ],
      "child2": [
        {
          "_type": "EntityChild2",
          "name": "Test333",
          "_id": 3,
          "child2_child1": [
            {
              "_type": "EntityChild2_1",
              "name": "Test444",
              "_id": 6,
              "child2_child1_child1": [
                {
                  "_type": "EntityChild2_1_1",
                  "name": "Test555",
                  "_id": 7
                }
              ]
            }
          ]
        }
      ],
      "_type": "EntityParent",
      "name": "Test000",
      "_id": 1,
      "child3": [
        {
          "_type": "EntityChild3",
          "name": "Test111",
          "_id": 4
        }
      ],
      "child4": [
        {
          "_type": "EntityChild4",
          "name": "Test666",
          "_id": 5
        }
      ]
    }
    ]

Это результат, который я ищу, я также хочу, чтобы parentId добавлялся к каждому узлу. Если для конкретного узла нет родителя, тогда он должен иметь значение -1.

[
  {
    "_type": "EntityParent",
    "name": "Test000",
    "_id": 1,
    "parentid": -1
  },
  {
    "_type": "EntityChild1",
    "name": "Test222",
    "_id": 2,
    "parentid": 1
  },
  {
    "_type": "EntityChild2",
    "name": "Test333",
    "_id": 3,
    "parentid": 1
  },
  {
    "_type": "EntityChild2_1",
    "name": "Test444",
    "_id": 6,
    "parentid": 3
  },
  {
    "_type": "EntityChild2_1_1",
    "name": "Test555",
    "_id": 7,
    "parentid": 6
  },
  {
    "_type": "EntityChild3",
    "name": "Test111 ",
    "_id": 4,
    "parentid": 1
  },
  {
    "_type": "EntityChild4",
    "name": "Test666",
    "_id": 5,
    "parentid": 1
  }
]

Сообщите мне, если потребуется дополнительная информация.

пожалуйста, добавьте свой код и что пошло не так.

Nina Scholz 31.10.2018 08:23

На самом деле я не смог понять, как преобразовать вложенный json в плоский json с добавлением родительского элемента к каждому узлу.

Akshay Kumar 31.10.2018 09:24
Поведение ключевого слова "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) для оценки ваших знаний,...
3
2
490
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Если свойство начинается с child, оно снова вызывает функцию с фактическим _id и помещает все элементы в набор результатов.

function getFlat(array, parentid) {
    return array.reduce((r, o) => {
        var temp = {};
        r.push(temp);
        Object.entries(o).forEach(([k, v]) => {
            if (k.startsWith('child')) {
                r.push(...getFlat(v, o._id));
            } else {
                temp[k] = v;
            }
        });
        temp.parentid = parentid;
        return r;
    }, []);
}


var data = [{ child1: [{ _type: "EntityChild1", name: "Test222", _id: 2 }], child2: [{ _type: "EntityChild2", name: "Test333", _id: 3, child2_child1: [{ _type: "EntityChild2_1", name: "Test444", _id: 6, child2_child1_child1: [{ _type: "EntityChild2_1_1", name: "Test555", _id: 7 }] }] }], _type: "EntityParent", name: "Test000", _id: 1, child3: [{ _type: "EntityChild3", name: "Test111", _id: 4 }], child4: [{ _type: "EntityChild4", name: "Test666", _id: 5 }] }],
    flat = getFlat(data, -1);

console.info(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Большое спасибо за такой быстрый ответ, и он работает, как ожидалось. Не могли бы вы сообщить мне, как добиться того же с помощью машинописного текста.

Akshay Kumar 31.10.2018 10:00

извините за машинописный текст, если не знаете о.

Nina Scholz 31.10.2018 10:02

Большое спасибо Нина Шольц

Akshay Kumar 31.10.2018 10:05

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