如何从父级获取带有字段的所有子元素的列表
How to get list of all child elements with field from parent
我有一个字典列表,其中一个字段中包含另一个列表。我想要 "flatten" 那个列表,所以它给了我每个子元素,其中有一个字段(或一些字段)从父级复制到它。示例:
源数据:
[
{
"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"
}
]
如果没有父节点引用,目前无法做到这一点。父节点访问仍然是listed as a feature request
您必须使用 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(_))
。
我有一个字典列表,其中一个字段中包含另一个列表。我想要 "flatten" 那个列表,所以它给了我每个子元素,其中有一个字段(或一些字段)从父级复制到它。示例:
源数据:
[
{
"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"
}
]
如果没有父节点引用,目前无法做到这一点。父节点访问仍然是listed as a feature request
您必须使用 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(_))
。