json - JQ递归树扩展

标签 json recursion dependencies jq

我正在尝试解析 JSON 结构以提取依赖路径,以便在自动化脚本中使用。

此 JSON 的结构被提取为如下格式:

[
  {
    "Id": "abc",
    "Dependencies": [
    ]
  },
  {
    "Id": "def",
    "Dependencies": [
      "abc"
    ]
  },
  {
    "Id": "ghi",
    "Dependencies": [
      "def"
    ]
  }
]

注意:删除了许多其他不相关的字段。

计划是能够将其中一个的 Id 传递到我的 JQ 命令中并返回一个列表。

例如:

输入:abc
预期输出:[]

输入:def
预期输出:["abc"]

输入:ghi
预期输出:["abc", "def"]

目前有一个像这样的 jq 脚本 ( https://jqplay.org/s/NAhuXNYXXO ):

    jq 
    '. as $original | .[] | 
    select(.Id == "INPUTVARIABLE") | 
    [.Dependencies[]] as $level1Dep | [$original[] | select( [ .Id == $level1Dep[] ] | any )] as $level1Full | $level1Full[] | 
    [.Dependencies[]] as $level2Dep | [$original[] | select ( [ .Id == $level2Dep[] ] | any )] as $level2Full | 
    [$level1Dep[], $level2Dep[]]'

输入:abc
输出:空

输入:def 输出:["abc"]

输入:ghi 输出:["def","abc"]

太棒了!然而,正如您所看到的,这不是特别可扩展的,并且只能处理两个依赖级别( https://jqplay.org/s/Zs0xIvJ2Zn ),并且当一个项目有多个依赖项( https://jqplay.org/s/eB9zHQSH2r )时也会严重崩溃。

有没有办法在 JQ 中构建它,或者我是否需要转向其他语言?

最佳答案

I know that the data cannot have circular dependencies, it is pulled from a database that enforces this.

那就没什么了。将输入 JSON 缩减为一个对象,其中每个 Id 和相应的依赖项数组都配对,并使用递归函数聚合依赖项来遍历它。

def deps($depdb; $id):
  def _deps($id): $depdb[$id] // empty
    | . + map(_deps(.)[]);
  _deps($id);
deps(map({(.Id): .Dependencies}) | add; $fid)

调用:

jq -c --arg fid 'ghi' -f prog.jq file

Online demo - arbitrary dependency levels
Online demo - multiple dependencies per Id

关于json - JQ递归树扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61345911/

相关文章:

node.js - bundledDependencies 相对于 npm 中的普通依赖项的优势

javascript - 如何访问 jQuery JSON 中的 HTML 元素属性

sql - Oracle 递归WITH 子句的底层工作原理

linux - 最大堆栈大小使用

makefile - 使用 gcc -MM 标志在单个文件中生成所有项目依赖项

android - "provided"范围不工作 - android studio with gradle

java - 改造:使用 Jackson 反序列化失败,没有任何错误

javascript - ajax 将多部分表单数据上传为 json 对象

ios - 如何在Swift 5中进行具有较大JSON响应的GET API调用?

java - 如何编写一个递归方法来将字符串提升为所有可能的组合,而不需要循环或数组?