首页 > 解决方案 > JQ将函数应用于dict但打印周围数据

问题描述

我想要

"1": {
        "id": "1",
        "type": "select",
        "label": "country :",
        "choices": {
          "1": {
            "label": "Canada CAN",
            "value": "",
          },
          "2": {
            "label": "United States USA",
            "value": ""
          }
        }
}

生产

"1": {
        "id": "1",
        "type": "select",
        "label": "country :",
        "choices": {
          "1": {
            "label": "Canada",
            "value": "CAN",
          },
          "2": {
            "label": "United States",
            "value": "USA"
          }
        }
}

到目前为止,我有一个由类似 sed 的函数组成的两步​​解决方案

def do_extract:
if .value | test("^$") then
    (.value = (.label | capture(".* (?<code>...)")).code) | .label = (.label | capture("(?<name>.*) ...$").name)
else
    .
end;

并直接访问子树[]."1"."choices"|keys_unsorted as $key|map_values(do_extract),但我必须手动复制粘贴输出来代替原始的“选择”字典。

有没有办法做这个功能,但仍然打印周围的数据?

谢谢

标签: jq

解决方案


为了得到你想要的结果,你可以这样做:

.[].choices[] |= (.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))

要在您的函数中执行此操作,我会将其更改为:

def do_extract:
  if .value == "" then
    (.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))
  else
    .
  end;

然后使用它:

.[].choices[] |= do_extract

推荐阅读