代码之家  ›  专栏  ›  技术社区  ›  Aidenhjj

如果父对象满足条件,则删除不同的嵌套对象

jq
  •  0
  • Aidenhjj  · 技术社区  · 4 年前

    我想从json文件中删除不同的子对象(同时保持原始结构),这取决于父对象的键是否满足给定的条件。

    假设我有:

    {
      "A": {
        "1": {
          "bar": 1,
          "foo": 0
        }
      },
      "B": {
        "2": {
          "not_here": 0,
          "foo": 0
        },
        "3": {
          "bar": 0,
          "foo": 1
        }
      },
      "C": {
        "4": {
          "bar": 0,
          "foo": 1
        }
      }
    }
    

    对于键在[“1”,“2”]中的所有嵌套对象,我要删除 bar 对象,否则我要删除 foo 对象,因此预期输出为:

    {
      "A": {
        "1": {
          "foo": 0
        }
      },
      "B": {
        "2": {
          "not_here": 0,
          "foo": 0
        },
        "3": {
          "bar": 0
        }
      },
      "C": {
        "4": {
          "bar": 0
        }
      }
    }
    

    .[][] |= (if .key == ("1", "2") then del(.bar) else del(.foo) end)
    

    但是我的条件语句有点问题,我认为它只是删除了 到处都是。

    0 回复  |  直到 4 年前
        1
  •  1
  •   peak    4 年前

    使用你的方法,你可以写:

    .[] |= with_entries(
       if (.key == "1" or .key == "2") 
       then .value |= del(.bar) 
       else .value |= del(.foo)
       end)
    

    with_entries 便于访问每个“键”和相应的“值”。

    你的尝试失败了,因为 .[][] 从运行 jq '.[][]' . 如果你这样做了,你就会明白为什么你的尝试最终会删除 foo 无条件键,关键是.key只在上下文中为您定义 有\个条目 (不过) to_entries 可以用来达到同样的效果)。