gpt4 book ai didi

javascript - 根据路径展平/减少嵌套 JSON,收集路径/层次结构中的字段

转载 作者:行者123 更新时间:2023-12-03 00:43:52 26 4
gpt4 key购买 nike

更新:2018 年 11 月 18 日:我在本文末尾添加了更多示例和说明。

我有由 Elasticsearch 聚合产生的嵌套 JSON 结构,看起来与此类似(针对示例进行了简化):

{
"some_field": "ignore",
"buckets": [
{
"key": "a",
"buckets": [
{ "key": "foo", "name": "FOO" },
{ "key": "bar", "name": "BAR" }
]
},
{
"key": "b",
"buckets": [
{ "key": "boo", "name": "BOO" },
{ "key": "baa", "name": "BAA" }
]
}
]
}

我想将其转换为

[ 
{key: "a", name: "FOO"},
{key: "a", name: "FOO"},
{key: "b", name: "BOO"},
{key: "b", name: "BAA"}
]

虽然对于任何特定情况来说这都是一个简单的问题,但我不想每次都“重新发明轮子”并为其编写代码。嵌套的级别可能会有所不同,我可能选择的字段(沿着路径)可能会有所不同。

以上是稍微简化的示例。由于这些来自 Elasticsearch 响应,另一个示例可能是:

"aggregations": {
"boo": {
"buckets": [
{
"key": "keyA",
"foo": {
"buckets": [
{
"key": "keyA.a",
"bar": {
"hits": {
"hits": [{"_index": "indexA", "_id": "idA", "_source": {"name": "nameA"}}]
}
}
}
]
}
},
{
"key": "keyB",
"foo": {
"buckets": [
{
"key": "keyA.a",
"bar": {
"hits": {
"hits": [{"_index": "indexB", "_id": "idB", "_source": {"name": "nameB"}}]
}
}
}
]
}
}
]
}

}

我想要的结果是展平/拾取字段

[
{"boo": "keyA", "foo": "keyA.a", "name": "nameA", "id": "idA"},
{"boo": "keyB", "foo": "keyA.a", "name": "name", "id": "idB"}
]

有谁知道使用 JMESPath、JSONPath、lodash 等的方法吗?使用 JSONPath 或 JMESPath 之类的东西,我可以轻松选择“叶子”值,但我试图在层次结构中沿路径收集字段。

如上所述,我可以对每种情况进行编码,但我想重用一个库并声明我的投影。

我想我可以用 jq 来做到这一点,但我需要它在浏览器中运行。

谢谢

最佳答案

Lodash 对于您的情况很有用,可以在浏览器中使用。 flapMapmap功能就是您所需要的。

const _ = require('lodash');
var obj = {
"some_field": "ignore",
"buckets": [
{
"key": "a",
"buckets": [
{ "key": "foo", "name": "FOO" },
{ "key": "bar", "name": "BAR" }
]
},
{
"key": "b",
"buckets": [
{ "key": "boo", "name": "BOO" },
{ "key": "baa", "name": "BAA" }
]
}
]
};

var res = _.flatMap(obj.buckets, x => {
return _.map(x.buckets, y => {
y.key = x.key;
return y;
});
});

console.log(res);
// Output:
// [ { key: 'a', name: 'FOO' },
// { key: 'a', name: 'BAR' },
// { key: 'b', name: 'BOO' },
// { key: 'b', name: 'BAA' }]

关于javascript - 根据路径展平/减少嵌套 JSON,收集路径/层次结构中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53329815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com