【问题标题】:Filtering deeply within tree在树内深度过滤
【发布时间】:2022-10-02 17:24:25
【问题描述】:

我试图在 JSON 结构中深度修剪节点,我很困惑为什么 empty 的行为似乎与这里的正常值不同。

输入

[
    {
        \"name\": \"foo\",
        \"children\": [{
            \"name\": \"foo.0\",
            \"color\": \"red\"
        }]
    },
    {
        \"name\": \"bar\",
        \"children\": [{
            \"name\": \"bar.0\",
            \"color\": \"green\"
        },
        {
            \"name\": \"bar.1\"
        }]
    },
    {
        \"name\": \"baz\",
        \"children\": [{
            \"name\": \"baz.0\"
        },
        {
            \"name\": \"baz.1\"
        }]
    }
]

程序

jq \'(.[].children|.[])|=if has(\"color\") then . else empty end\' foo.json

实际输出

[
  {
    \"name\": \"foo\",
    \"children\": [
      {
        \"name\": \"foo.0\",
        \"color\": \"red\"
      }
    ]
  },
  {
    \"name\": \"bar\",
    \"children\": [
      {
        \"name\": \"bar.0\",
        \"color\": \"green\"
      }
    ]
  },
  {
    \"name\": \"baz\",
    \"children\": [
      {
        \"name\": \"baz.1\"
      }
    ]
  }
]

预期产出

我得到的输出,除了没有baz.1 孩子,因为那个没有颜色。

问题

除了正确的解决方案之外,我还很好奇为什么将脚本中的empty 替换为42 之类的常规值会按预期将没有颜色的孩子替换为42,但是当替换为empty 时,它看起来像else 分支没有被执行?

  • baz 孩子是从哪里来的?那不是在输入?
  • @0stone0 抱歉,我从错误的文件中复制。现在修好了。

标签: json jq


【解决方案1】:
.[].children |= map(select(.color))

将删除不属于haschildrencolor,因此输出变为:

[
  {
    "name": "foo",
    "children": [
      {
        "name": "foo.0",
        "color": "red"
      }
    ]
  },
  {
    "name": "bar",
    "children": [
      {
        "name": "bar.0",
        "color": "green"
      }
    ]
  },
  {
    "name": "baz",
    "children": []
  }
]
Online demo

关于为什么你的过滤器似乎不喜欢empty
git issue 似乎是原因,empty 的多个元素将失败。

【讨论】:

  • 抱歉,我发布了错误的输入。输入正确,问题仍然存在。
  • 谢谢!您知道我编写的脚本中输出不同的原因是什么吗?
【解决方案2】:

empty 分配给多个路径一定存在错误。

在这种情况下,您可以改用del

del(.[].children[] | select(has("color") | not))

Online demo

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2017-08-13
  • 2017-03-07
相关资源
最近更新 更多