Я работаю с 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
с таким именем. Если возможно, порядок объектов и свойства длины должны быть всем, что необходимо для построения объекта.
«Мой вопрос в том, есть ли хорошее эффективное и чистое решение для создания объекта?» - конечно, попробуйте, и если у вас возникнут трудности, вернитесь с более конкретными вопросами о том, что вы пробовали и что вам сложно.
Вы где-то пропустили {key: 'address'}
?
Да, я был, я добавил это.
Вот простая реализация без обработки ошибок.
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))
Привет! Пожалуйста, возьмите тур (вы получите значок!) и прочитайте центр помощи, в частности Как задать хороший вопрос?. Лучше всего провести исследование, поиск для связанных тем на SO, и попробовать. Если вы застряли и не можете выбраться после дополнительных исследований и поиска, опубликуйте минимальный воспроизводимый пример свою попытку и конкретно укажите, где вы застряли. Люди будут рады помочь.