假设我有以下JSON对象(这只是一个例子):
{
"foo": 1,
"bar": 2,
"baz": 3
}
和以下JSON数组(另一个例子):
["foo", "baz"]
如何使用jq输出以下对象?
{
"foo": 1,
"baz": 3
}
我讨厌问这个问题,因为我确信这个问题以前已经有答案了,但是谷歌让我失望了,我的智商只是没有达到它需要的水平。
使用reduce
迭代构建结果对象将是一种方法:
echo '["foo", "baz"]' | jq --argjson index '{"foo":1,"bar":2,"baz":3}' '
reduce .[] as $x ({}; .[$x] = $index[$x])
'
使用JOIN
,创建键值对,并使用from_entries
进行组装将是另一种方法:
echo '["baz", "foo"]' | jq --argjson index '{"foo":1,"bar":2,"baz":3}' '
JOIN($index; .) | map({key:.[0], value:.[1]}) | from_entries
'
输出:
{
"foo": 1,
"baz": 3
}
假设.
是对象,$arr
是数组,下面的代码可以实现
delpaths(keys - $arr | map([.]))
要达到预期的结果,可以这样写:
jq '{foo, baz}'
这可以(带着相当大的恐惧)通过文本争用来解决给定的问题,例如:
jq "$(echo '["foo", "baz"]' | jq -Rr '"{" + .[1:-1] + "}" ')"
或
jq "$(echo '["foo", "baz"]' | sed -e 's/[/{/' -e 's/]/}/')"
这里有一个无约的解决方案,它假设$keys是感兴趣的键的数组,这可能比涉及数组减法的解决方案更有效:
. as $in | INDEX( $keys[]; $in[.] )