如何使用 JQ 限制给定 属性 名称数组的 JSON 对象的属性?
How to limit properties of a JSON object given array of property names using JQ?
假设我有以下 JSON 对象 (这只是一个例子):
{
"foo": 1,
"bar": 2,
"baz": 3
}
和下面的JSON数组(另一个例子):
["foo", "baz"]
如何使用jq输出以下对象?
{
"foo": 1,
"baz": 3
}
我讨厌问这个问题,因为我觉得以前有人回答过这个问题,但是 google 让我失望了,我的 jq-fu 不在需要解决这个问题的地方。
使用 reduce
迭代构建结果对象是一种方法:
echo '["foo", "baz"]' | jq --argjson index '{"foo":1,"bar":2,"baz":3}' '
reduce .[] as $x ({}; .[$x] = $index[$x])
'
使用 JOIN
,创建 key-value 对,并使用 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([.]))
这是一个 reduce-free 解决方案,假设 $keys 是感兴趣的键数组,并且可能比涉及数组减法的解决方案更有效:
. as $in | INDEX( $keys[]; $in[.] )
为了达到预期的效果,可以这样写:
jq '{foo, baz}'
这可以(有相当大的恐惧)通过文本争论成为给定问题的解决方案,例如沿着:
jq "$(echo '["foo", "baz"]' | jq -Rr '"{" + .[1:-1] + "}" ')"
或
jq "$(echo '["foo", "baz"]' | sed -e 's/\[/{/' -e 's/\]/}/')"
假设我有以下 JSON 对象 (这只是一个例子):
{
"foo": 1,
"bar": 2,
"baz": 3
}
和下面的JSON数组(另一个例子):
["foo", "baz"]
如何使用jq输出以下对象?
{
"foo": 1,
"baz": 3
}
我讨厌问这个问题,因为我觉得以前有人回答过这个问题,但是 google 让我失望了,我的 jq-fu 不在需要解决这个问题的地方。
使用 reduce
迭代构建结果对象是一种方法:
echo '["foo", "baz"]' | jq --argjson index '{"foo":1,"bar":2,"baz":3}' '
reduce .[] as $x ({}; .[$x] = $index[$x])
'
使用 JOIN
,创建 key-value 对,并使用 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([.]))
这是一个 reduce-free 解决方案,假设 $keys 是感兴趣的键数组,并且可能比涉及数组减法的解决方案更有效:
. as $in | INDEX( $keys[]; $in[.] )
为了达到预期的效果,可以这样写:
jq '{foo, baz}'
这可以(有相当大的恐惧)通过文本争论成为给定问题的解决方案,例如沿着:
jq "$(echo '["foo", "baz"]' | jq -Rr '"{" + .[1:-1] + "}" ')"
或
jq "$(echo '["foo", "baz"]' | sed -e 's/\[/{/' -e 's/\]/}/')"