Как получить список всех дочерних элементов с полем из родительского
У меня есть список диктов, который содержит другой список в одном из полей. Я хочу "сгладить" этот список, чтобы он давал мне каждый вложенный элемент с одним полем (или несколькими полями) из родительского элемента, скопированного в него. Пример:
Источник данных:
[
{
"name": "A",
"foo": "x",
"bar": 1,
"subelements": [
{
"baz": "xyz",
"foobar": "abc"
},
{
"baz": "zzz",
"foobar": "def"
}
]
},
{
"name": "B",
"foo": "Y",
"bar": 4,
"subelements": [
{
"baz": "yyy",
"foobar": "aaa"
},
{
"baz": "xxx",
"foobar": "bbb"
},
{
"baz": "www",
"foobar": "bbb"
}
]
}
]
Ожидаемый результат:
[
{
"baz": "xyz",
"foobar": "abc",
"foo": "x"
},
{
"baz": "zzz",
"foobar": "def",
"foo": "x"
},
{
"baz": "yyy",
"foobar": "aaa",
"foo": "Y"
},
{
"baz": "xxx",
"foobar": "bbb",
"foo": "Y"
},
{
"baz": "www",
"foobar": "bbb",
"foo": "Y"
}
]
2 ответа
В настоящее время это невозможно сделать без ссылки на родительский узел. Доступ к родительскому узлу по-прежнему указан как запрос функции
Вы должны использовать JMESPath? Это не сложно сделать в Vanilla JS:
ans = [];
input.forEach(elem =>
elem["subelements"].forEach(subElem => {
ans.push(Object.assign({
foo: a["foo"]
}, subElem))
})
);
Или, если вам нравится немного больше FP,
ans = Array.prototype.concat.apply([], input.map(elem =>
elem["subelements"].map(subElem =>
Object.assign({
foo: a["foo"]
}, subElem)
)
));
Если вы используете сервер ECMAScript 2018 или заполняете его, то вы можете заменить Object.assign({foo: a["foo"]}, elem)
с {foo: a["foo"], ...elem}
, ECMAScript 2015 позволяет вам делать [].concat(...input.map(_))
для второго решения.