如何从父级获取带有字段的所有子元素的列表

时间:2018-10-06 20:19:28

标签: jmespath

我有一个字典列表,其中一个字段中包含另一个列表。我想“拉平”该列表,因此它为我提供了每个子元素,其中每个元素都有一个或多个父域复制到其中。示例:

源数据:

[
    {
        "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 :(得分:3)

如果没有父节点引用,当前无法做到这一点。父节点访问仍为listed as a feature request

答案 1 :(得分:-1)

您必须使用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(_))