首页 > 解决方案 > 如何根据属性值是否在数组中使用 jq 过滤 JSON?

问题描述

我有一些 JSON 需要根据数组中是否存在某些属性值进行过滤。

我有一些有用的东西,但如果感觉像一个杂物。有没有更简洁的方法来做到这一点?

输入

{"potato":4}

筛选

select(.potato as $k | ([1,2,3,4] | any(. == $k)))

输出

{
  "potato": 4
}

jqplay 链接 https://jqplay.org/s/Ts97jkk21K

标签: jsonfilteringjq

解决方案


这似乎不那么杂乱无章了吗?

[1,2,3,4] as $acceptable
| .potato as $k
| select( any($acceptable[];  . == $k) )

如果你的 jq 有IN/1,你可以跳过$k

[1,2,3,4] as $acceptable
| select(.potato | IN($acceptable[]))

例如,这种样式可以很容易地$acceptable作为命令行参数传入。

诱惑

仅选择解决方案的简单性很容易被诱惑,例如:

[1,2,3,4] as $acceptable
| select($acceptable[] == .potato)

这在某些情况下会很好,例如 if$acceptable很短并且不包含重复项(假设我们想要 的语义any)。但是any并且IN具有可能需要的短路语义,例如为了效率。


推荐阅读