使用多个条件过滤对象,包括比较两个对象字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用多个条件过滤对象,包括比较两个对象字段相关的知识,希望对你有一定的参考价值。
有一个JSON对象列表,我试图根据最小值检查和两个字段之间的比较来过滤它们。
{
"preview": false,
"init_offset": 0,
"messages": [],
"fields": [
{
"name": "A"
},
{
"name": "B"
},
{
"name": "Diff"
},
{
"name": "Threshold"
}
],
"results": [
{
"A": "foo",
"B": "bar",
"Diff": "1095",
"Threshold": "1200"
},
{
"A": "baz",
"B": "bux",
"Diff": "81793",
"Threshold": "0"
},
{
"A": "quux",
"B": "quuz",
"Diff": "194"
},
{
"A": "moo",
"B": "goo",
"Diff": "5000",
"Threshold": "2000"
}
]
}
我最近来的是
.results
| map(.Threshold //= "0")
| .[]
| select((.Threshold|tonumber > 0) and
(.Diff|tonumber > .Threshold|tonumber))
但这给了一个
Cannot index string with string "Threshold"
错误。
基本上我想返回Diff大于非零阈值的所有结果。所以在这种情况下:
{
"A": "moo",
"B": "goo",
"Diff": "5000",
"Threshold": "2000"
}
使用jq 1.5 FWIW。
答案
你只是错过了一些括号。相比:
select((.Threshold|tonumber) > 0 and
(.Diff|tonumber) > (.Threshold|tonumber))
或者避免双重转换:
select( (.Threshold|tonumber) as $t
| $t > 0 and (.Diff|tonumber) > $t )
您还可以简化整个程序:
.results[]
| select( ((.Threshold // 0) | tonumber) as $t
| $t > 0 and (.Diff|tonumber) > $t )
以上是关于使用多个条件过滤对象,包括比较两个对象字段的主要内容,如果未能解决你的问题,请参考以下文章
如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个
Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段