Как динамически построить объект Javascript на основе потока

Я работаю с React и хочу визуализировать объект. Объект должен создаваться динамически на основе потока входящих объектов JSON из серверной службы gRPC. Поток приходит в определенной форме:

Основной объект заголовка со свойством длины, относящимся к количеству пар ключ/значение в объекте. Строящийся объект также может содержать вложенные объекты. Для вложенного объекта поток будет содержать другой тип объекта заголовка со свойством длины, которое ссылается на количество пар ключ/значение во вложенном объекте. Я буду называть это заголовком свойства.

Позвольте мне проиллюстрировать это примером. Ниже приведен объект, который необходимо построить.

{
  name: 'John',
  address: {
    street: 'Kennedy avenue',
  },
  age: 25,
}

Входящий поток будет следующим:

{
  mainHeader: {
    length: 3,
  },
}
{
  key: 'name',
}
{
  str: 'John',
}
{
  key: 'address',
}
{
  propertyHeader: {
    length: 1,
  },
}
{
  key: 'street',
}
{
  str: 'Kennedy avenue',
}
{
  key: 'age',
}
{
  num: 25,
}

Я помещаю все эти объекты в массив переменных состояния по порядку (mainHeader с индексом 0). Мой вопрос: есть ли хорошее эффективное и чистое решение для создания объекта? Я бы предпочел, чтобы решение не зависело от свойств key с таким именем. Если возможно, порядок объектов и свойства длины должны быть всем, что необходимо для построения объекта.

Привет! Пожалуйста, возьмите тур (вы получите значок!) и прочитайте центр помощи, в частности Как задать хороший вопрос?. Лучше всего провести исследование, поиск для связанных тем на SO, и попробовать. Если вы застряли и не можете выбраться после дополнительных исследований и поиска, опубликуйте минимальный воспроизводимый пример свою попытку и конкретно укажите, где вы застряли. Люди будут рады помочь.

T.J. Crowder 09.04.2019 16:51

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

junvar 09.04.2019 17:01

Вы где-то пропустили {key: 'address'}?

btilly 09.04.2019 17:30

Да, я был, я добавил это.

dazzaondmic 09.04.2019 17:39
Поведение ключевого слова "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
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот простая реализация без обработки ошибок.

function parseStream(stream) {
    var firstChunk = stream.shift();
    return nestedParse(firstChunk.mainHeader.length, stream);
}

function nestedParse(length, stream) {
    var answer = {};
    while (0 < length) {
        length--;
        var keyChunk = stream.shift();
        var nextChunk = stream.shift();
        if (nextChunk.propertyHeader) {
            answer[ keyChunk.key ] = nestedParse(nextChunk.propertyHeader.length, stream);
        }
        else if ('str' in nextChunk) {
            answer[ keyChunk.key ] = nextChunk.str;
        }
        else if ('num' in nextChunk) {
            answer[ keyChunk.key ] = nextChunk.num;
        }

    }
    return answer;
}

console.info(parseStream(stream))

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