在JavaScript中重组JSON

时间:2019-03-25 13:24:29

标签: javascript arrays json object nested

我有这个要使用NodeJS解析的JSON,需要将其重构为我在下面添加的第二个JSON。

在第一个JSON中,rows对象具有两个pages对象(可以存在任意数量的pages对象),其中包含所有相同的键和值,但{ {1}}和values键。

display

在第二个JSON中,{ "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 } ] } ] } 对象只有一个rows对象,其中的pagesvalues键具有多个值(非公共值)

display

因此,我想知道执行此操作的快速简便的步骤。请让我知道解决此问题的过程和方法。

谢谢

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则希望将所有页面合并到一个包含所有信息的页面中。

这可以使用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。如果每个数组中确实有多个值,则必须相应地遍历所有这些值。