Как получить список всех дочерних элементов с полем из родительского - PullRequest
0 голосов
/ 06 октября 2018

У меня есть список диктов, который содержит другой список в одном из полей.Я хочу «сгладить» этот список, чтобы он давал мне каждый вложенный элемент с одним полем (или несколькими полями) из родительского элемента, скопированного в него.Пример:

Исходные данные:

[
    {
        "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 ]

0 голосов
/ 17 октября 2018

Вам нужно использовать 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(_)) для второго решения.

0 голосов
/ 16 октября 2018

В настоящее время невозможно обойтись без ссылки на родительский узел.Доступ родительского узла по-прежнему указан как запрос функции

...