首页 > 解决方案 > 根据子数组的值删除json数组元素

问题描述

我有以下包含此数组结构的 json 文件:

{
  "outer": [
    {
      "inner": [
        {
          "value": "val1"
        },
        {
          "value": "val3"
        }
      ]
    },
    {
      "inner": [
        {
          "value": "val2"
        },
        {
          "value": "val1"
        }
      ]
    },
    {
      "inner": [
        {
          "value": "val2"
        },
        {
          "value": "val1"
        },
        {
          "value": "val3"
        }
      ]
    }
  ]
}

我想innerouter数组中删除其元素具有特定值并且具有特定长度的数组。例如,如果我想删除inner包含值的数组,"val1"结果"val2"应该是:

{
  "outer": [
    {
      "inner": [
        {
          "value": "val1"
        },
        {
          "value": "val3"
        }
      ]
    },
    {
      "inner": [
        {
          "value": "val2"
        },
        {
          "value": "val1"
        },
        {
          "value": "val3"
        }
      ]
    }
  ]
}

我努力了

jq 'del( .outer[]|select(.inner[0].value == "val1"))'

但我不知道如何检查第二个条件,即长度,除此之外,这些值可能以任何顺序出现。

标签: jsonbashjq

解决方案


jq您正在寻找的过滤器是:

del(.outer[] | select(.inner | map(.value) | sort == ["val1", "val2"]))

.inner | map(.value)生成一个数组,其中包含与 所包含的value所有对象中的键关联的值.inner

sort需要,因为==对数组进行一对一的比较。这样,.inner无论它们的顺序如何,它都会匹配包含的对象。当然,您必须在右侧使用排序数组(即["val1", "val2"]而不是["val2", "val1"])。

看到它在行动


推荐阅读