如何基于流动态构建Javascript对象

时间:2019-04-09 14:48:53

标签: javascript reactjs algorithm stream

我正在使用React,我想渲染一个对象。必须基于来自gRPC后端服务的传入JSON对象流动态构建该对象。流以特定形式出现:

具有长度属性的主标头对象,该属性引用对象中键/值对的数量。要构建的对象也可以包含嵌套对象。对于嵌套对象,流将包含另一种类型的标头对象,其长度属性将引用嵌套对象中键/值对的数量。我将其称为属性标题。

让我举例说明。 以下是要构建的对象。

{
  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,
}

我将所有这些对象按顺序推入状态变量数组(索引为0的mainHeader)。我的问题是,是否有一个很好的高效清洁的解决方案来构建对象?我希望解决方案不依赖于具有该名称的key属性。如果可能的话,对象的顺序和length属性应该是构建对象所需的全部。

1 个答案:

答案 0 :(得分: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.log(parseStream(stream))