arrays - 用节点替换 jq 中从根开始的路径

标签 arrays json path jq

如何使用 jq 将树中的某个匹配节点替换为从根节点到该节点的路径?

使用walk,只能访问从当前节点向下树的路径:

https://jqplay.org/s/BVOQ-xa1JM :

walk(if type == "object" and has("d") then .d = path(.) else . end)

输入:

{"a": {"b": 1, "c": {"d": 2}}, "e": {"d}

结果:

{
  "a": {
    "b": 1,
    "c": {
      "d": []
    }
  },
  "e": {
    "d": []
  }
}

期望的结果是:

{
  "a": {
    "b": 1,
    "c": {
      "d": ["a", "c"]
    }
  },
  "e": {
    "d": ["e"]
  }
}

注意:这不能导致整个树的重复,如下所示:

(paths | select(.[-1] == "d")) as $f | setpath($f; $f[:-1])

原因:

{
  "a": {
    "b": 1,
    "c": {
      "d": [
        "a",
        "c"
      ]
    }
  },
  "e": {
    "d": 3
  }
}
{
  "a": {
    "b": 1,
    "c": {
      "d": 2
    }
  },
  "e": {
    "d": [
      "e"
    ]
  }
}

最佳答案

您的预期输出不正确,因为 b 不涉及从根开始的 d 的向下路径。您可以在 --null-input 模式下使用涉及 setpath()paths 函数,即使用 jq -n

( inputs | paths | select(.[-1] == "d")) as $f | setpath($f; $f[:-1])

这个想法是在变量 $f 中构建直到 d 的路径 channel ,并使用 set path 函数在其上设置值。 [:-1] 部分修剪数组中离开叶节点的最后一个条目。

jqplay demo

关于arrays - 用节点替换 jq 中从根开始的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68371453/

相关文章:

javascript - 将字符串按照指定长度分割成数组

c# - 无法反序列化 Withings 响应

java - 获取JAVA EE服务器中已安装服务器的路径

string - 如何将 PathBuf 转换为字符串

javascript - 如何通过删除变换属性来重新创建 svg 路径?

javascript - JS : Objects into array

c++ - 字符串和字符串数组的零初始化(C++)

json - 如何使用 Groovy 代码删除响应正文中 Gerrit 的 REST API 的魔术前缀?

arrays - 如何使用 jq 将数组拆分为多个 block ?

javascript - 传单中的 geojson 和 json 无法连接在一起