我正在尝试根据对象列表更新某些对象。例如,我想打开它:
{
"names": ["a","c"],
"del": {
"a": true,
"b": true,
"c": true
}
}
对此:
{
"names": ["a","c"],
"del": {
"a": false,
"b": true,
"c": false
}
}
因此,对于.names
中的每个对象名称,请更新.del
中的相应对象
我可以提供的解决方案似乎效率低下,我想知道是否有更好的方法。
[foreach .names[] as $name (.;.del[$name] = false ; .) ] | last
答案 0 :(得分:1)
我认为使用last
可以很好地表明您不在乎中间值,因为foreach 1被描述为:
foreach语法与reduce相似,但旨在允许构造limit和reducer来产生中间结果
有一个等效的减少:
reduce .names[] as $name (.; .del[$name]=false)
当两者都可行时,reduce在与其他程序员进行交流和潜在表现方面的代码方面更为高效。 (如果发现reduce
的实现比使用foreach
的模式慢,那么jq可以使用该模式重新实现reduce
。)