如何使用 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/\]/}/')"