`query |= transform` 用于根据键修改对象值

`query |= transform` for modifying object values based on keys

如果你想修改数组中某些元素的值,你可以使用类似

的东西
ARRAY |= map( if FILTER then TRANSFORM else . end )

ARRAY[] |= if FILTER then TRANSFORM else . end

不过,我喜欢 QUERY |= TRANSFORM 模式。

( ARRAY[] | select( FILTER ) ) |= TRANSFORM

所有这些也适用于对象(使用 map_value 而不是 map),只要过滤器仅取决于元素值。但是,如果过滤器依赖于密钥怎么办?我可以想出解决方案,例如

OBJECT |= with_entries( if .key | FILTER then .value |= TRANSFORM else . end )

但是在那种情况下,有没有办法得到 QUERY |= TRANSFORM 形式的东西?


具体例子

.o |= with_entries( if .key | tonumber? // false then .value |= . + 100 else . end )
{
  "o": {
    "a": 3,
    "b": 4,
    "1": 3,
    "2": 4
  }
}
{
  "o": {
    "a": 3,
    "b": 4,
    "1": 103,
    "2": 104
  }
}

Demo 在 jqplay

找到方法:

( OBJECT | .[ keys_unsorted[] | select( FILTER ) ] ) |= TRANSFORM

应用于示例:

( .o | .[ keys_unsorted[] | select( tonumber? ) ] ) |= . + 100

Demo 在 jqplay

相同的想法,但使用 to_entries 来为查询提供对键和值的访问权限:

( .o | .[ to_entries[] | select( .key | tonumber? ) | .key ] ) |= . + 100

Demo 在 jqplay