我有以下的json:
[
{"id": "1", "type": "folder", "title": "folder-1"},
{"id": "2", "type": "folder", "title": "folder-2"},
{"id": "3", "type": "item", "title": "item-1", "folder": "1"},
{"id": "4", "type": "item", "title": "item-2", "folder": "2"},
{"id": "5", "type": "item", "title": "item-3"}
]基本上,我需要使用jq生成这个输出,这类似于sql的结果:
[
{"type": "item", "title": "item-1", "folder": "folder-1"},
{"type": "item", "title": "item-2", "folder": "folder-2"},
{"type": "item", "title": "item-3"}
]有什么想法吗?
发布于 2014-08-05 19:18:15
试试这个过滤器:
map(
(select(.type=="item") | { key: .folder, value: { type, title } }),
(select(.type=="folder") | { key: .id, value: { folder: .title } })
)
| group_by(.key)
| map(
(map(select(.key != null) | .value) | add)
// map(.value)[]
)你得把它分成几步。
发布于 2014-08-05 12:41:55
jq 'map(select(has("folder") or (.["title"] | startswith("item"))) | del(.id))' sample_file输出:
[
{
"type": "item",
"title": "item-1",
"folder": "1"
},
{
"type": "item",
"title": "item-2",
"folder": "2"
},
{
"type": "item",
"title": "item-3"
}
]发布于 2017-08-25 15:10:28
下面是另一种解决方案,通过将数据分离为两个对象( $folders和$items ),然后构造所需的结果。
(
reduce map(select(.type == "folder"))[] as $f (
{}
; .[$f.id] = $f
)
) as $folders
| (
reduce map(select(.type == "item"))[] as $i (
{}
; .[$i.id] = $i
)
) as $items
| [
$items[]
| {type, title, folder}
| if .folder == null then del(.folder) else .folder = $folders[.folder].title end
]如果您的jq版本有指数/2
def INDEX(stream; idx_expr):
reduce stream as $row ({};
.[$row|idx_expr|
if type != "string" then tojson
else .
end] |= $row);这可以简化为
INDEX(.[] | select(.type == "folder"); .id) as $folders
| INDEX(.[] | select(.type == "item"); .id) as $items
| [
$items[]
| {type, title, folder}
| if .folder == null then del(.folder) else .folder = $folders[.folder].title end
]https://stackoverflow.com/questions/25131293
复制相似问题