jq根据对象名称数组更新对象

时间:2019-02-23 15:01:34

标签: jq

我正在尝试根据对象列表更新某些对象。例如,我想打开它:

{
  "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

1 个答案:

答案 0 :(得分:1)

我认为使用last可以很好地表明您不在乎中间值,因为foreach 1被描述为:

  

foreach语法与reduce相似,但旨在允许构造limit和reducer来产生中间结果

有一个等效的减少:

reduce .names[] as $name (.; .del[$name]=false)

当两者都可行时,reduce在与其他程序员进行交流和潜在表现方面的代码方面更为高效。 (如果发现reduce的实现比使用foreach的模式慢,那么jq可以使用该模式重新实现reduce。)