我有这个要使用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
对象,其中的pages
和values
键具有多个值(非公共值)
display
因此,我想知道执行此操作的快速简便的步骤。请让我知道解决此问题的过程和方法。
谢谢
答案 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
是减少的中间结果。
该对象看起来就像您在不需要它们的太多数组中。给定的代码片段仅适用于每个数组中的第一个元素(因此[0]
s。如果每个数组中确实有多个值,则必须相应地遍历所有这些值。