主題として、all_keys
関数を記述して、任意にネストしたjsonブロブからすべてのキーを抽出し、必要に応じて配列とオブジェクトをトラバースし、重複することなく、キーを含む。 all_keys
のfuctionは、この出力を生成する必要があり任意のネストされたjsonデータから任意のネストされたjsonデータをjqで抽出する
[
{"name": "/", "children": [
{"name": "/bin", "children": [
{"name": "/bin/ls", "children": []},
{"name": "/bin/sh", "children": []}]},
{"name": "/home", "children": [
{"name": "/home/stephen", "children": [
{"name": "/home/stephen/jq", "children": []}]}]}]},
{"name": "/", "children": [
{"name": "/bin", "children": [
{"name": "/bin/ls", "children": []},
{"name": "/bin/sh", "children": []}]},
{"name": "/home", "children": [
{"name": "/home/stephen", "children": [
{"name": "/home/stephen/jq", "children": []}]}]}]}
]
:以下の入力与え例えば
、この目的のために
[
"children",
"name"
]
は、私は次の関数を考案し、それはそれと同じくらい遅いです畳み込まれているので、私は同じ結果を得るためのより簡潔で速い方法を考え出すことができるかどうか疑問に思っていました。参考のため
def all_keys:
. as $in |
if type == "object" then
reduce keys[] as $k (
[];
. + [$k, ($in[$k] | all_keys)[]]
) | unique
elif type == "array" then (
reduce .[] as $i (
[];
. + ($i | all_keys)
) | unique
)
else
empty
end
;
、this 53MB json fileにその機能を実行すると、(私が知っている、それは非常に古代のですが、まだ正常に動作します)私のインテル[email protected] CPUにおよそ22秒かかります。
ありがとう! 私は '..'演算子を完全に見逃していましたが、私が考案した解決策以外の何も想像できませんでした。あなたの最後のアプローチは私のマシンで約14秒かかりますが、あなたが_naive_と書いたものは19秒かかります。 –
実際、私はとにかく '..'の代わりに' recurse(。[]?) 'を使うことができたことに気付きました。私は物事をより複雑にしていると感じました。 :Pありがとう! –