Реструктуризация JSON в JavaScript

У меня есть этот JSON, который я анализирую с помощью NodeJS, и его нужно преобразовать во второй JSON, который я добавил ниже.

В первом JSON объект rows имеет два объекта pages (может присутствовать любое количество объектов pages), которые содержат все те же ключи и значения, за исключением ключей values и display.

{
  "pages": [
    {
      "label": "SomeLabel",
      "name": "Some",
      "sections": [
        {
          "type": "Repeat",
          "label": "Label 1",
          "name": "Name 1",
          "rows": [
            {
              "pages": [
                {
                  "label": "Label 1",
                  "name": "Name 1",
                  "sections": [
                    {
                      "type": "Flow",
                      "label": "Label 2",
                      "name": "Name 2",
                      "answers": [
                        {
                          "label": "Question Label",
                          "question": "Question",
                          "values": [
                            "Value A"
                          ],
                          "valuesMetadata": [
                            {
                              "display": "Display A",
                              "row": {
                                "columns": []
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "pages": [
                {
                  "label": "Label 1",
                  "name": "Name 1",
                  "sections": [
                    {
                      "type": "Flow",
                      "label": "Label 2",
                      "name": "Name 2",
                      "answers": [
                        {
                          "label": "Question Label",
                          "question": "Question",
                          "values": [
                            "Value B"
                          ],
                          "valuesMetadata": [
                            {
                              "display": "Display B",
                              "row": {
                                "columns": []
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "footer": null
        }
      ]
    }
  ]
}

Во втором JSON объект rows имеет один объект pages, внутри которого ключи values и display имеют несколько значений (необычные значения).

{
  "pages": [
    {
      "label": "SomeLabel",
      "name": "Some",
      "sections": [
        {
          "type": "Repeat",
          "label": "Label 1",
          "name": "Name 1",
          "rows": [
            {
              "pages": [
                {
                  "label": "Label 1",
                  "name": "Name 1",
                  "sections": [
                    {
                      "type": "Flow",
                      "label": "Label 2",
                      "name": "Name 2",
                      "answers": [
                        {
                          "label": "Question Label",
                          "question": "Question",
                          "values": [
                            "Value A",
                            "Value B"
                          ],
                          "valuesMetadata": [
                            {
                              "display": [
                                "Display A",
                                "Display B"
                              ],
                              "row": {
                                "columns": []
                              }
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ],
          "footer": null
        }
      ]
    }
  ]
}

Итак, я хочу знать, как быстро и легко это сделать. Пожалуйста, дайте мне знать процесс и методы решения этой проблемы.

Спасибо

Можете ли вы изменить это в небольшом примере input и output, чтобы они могли легко помочь

G.aziz 25.03.2019 14:30

Было бы легче читать/решать, если бы вы явно указали нам различия между старым и новым json.

jBuchholz 25.03.2019 14:33

Привет, @Scorpioo590, я отредактировал свой пост, добавив более короткий JSON и более описательное резюме. Пожалуйста, помогите мне!

mv_cl 26.03.2019 06:34

@ G.aziz, пожалуйста, ознакомьтесь с моим отредактированным вопросом и помогите мне.

mv_cl 26.03.2019 06:35
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
127
1

Ответы 1

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

Этого можно добиться с помощью функции Array.reduce. reduce берет массив и объединяет все элементы в одно значение, используя функцию (предоставленную вами) для объединения первых двух элементов, пока не останется только один (т. е. 1 * 2 => new1; new1 * 3 => new2, где * представляет вашу функцию).

Ваша проблема будет выглядеть примерно так:

rows[0].pages = rows[0].pages.reduce((currentElement, currentState) => {
    if (!currentState) { // first iteration return first element but make sure display is an array
        currentElement.sections[0].answers[0].valuesMetadata[0].display =
            [currentElement.sections[0].answers[0].valuesMetadata[0].display];
        return currentElement;
    }

    // add values of current element to arrays in current state
    currentState.sections[0].answers[0].values
        .concat(currentElement.sections[0].answers[0].values);
    currentState.sections[0].answers[0].valuesMetadata[0].display
        .concat(currentElement.sections[0].answers[0].valuesMetadata[0].display);
    return currentState;
});

currentElement — объект массива, который в данный момент сокращается, currentState — промежуточный результат сокращения.

PS:

Объект выглядит так, как будто у вас слишком много массивов, где они вам не нужны. Данный фрагмент кода работает только для первого элемента в каждом массиве (отсюда и [0]s. Если у вас действительно есть несколько значений в каждом массиве, вам придется перебирать их все соответственно.

Не могли бы вы привести пример с циклами? Это та часть, с которой я застрял.

mv_cl 26.03.2019 13:05

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