如何使用JQ限制JSON对象给定属性名称数组的属性?



假设我有以下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[.] )

最新更新