Ответ 1
В настоящее время это невозможно сделать без ссылки на родительский узел. Доступ к родительскому узлу по-прежнему отображается как запрос функции
У меня есть список dicts, который содержит другой список в одном из полей. Я хочу "расплющить" этот список, поэтому он дает мне каждый подэлемент с одним полем (или некоторыми полями) от родителя, скопированного в него. Пример:
Источник данных:
[
{
"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"
}
]
В настоящее время это невозможно сделать без ссылки на родительский узел. Доступ к родительскому узлу по-прежнему отображается как запрос функции
Вам нужно использовать 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(_))
для второго решения.