【问题标题】:How do I remove elements from array in a JSON object containing a value如何从包含值的 JSON 对象中的数组中删除元素
【发布时间】:2018-05-25 16:10:33
【问题描述】:

请注意,这篇文章被标记为jq,我根本不想用javascript来做这件事。

我有一个对象,它有一个数组作为其字段之一。我想从对象数组中删除符合条件的元素,但保留对象。我环顾四周,我只能发现返回 just 的数组的 sn-ps 现在恰好有更少的项目。

这是一个例子:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    },
    {
      "id": null,
      "msg": "done"
    }
  ]
}

我想取回以下内容:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    }
  ]
}

注意:以防万一这会影响答案,我真的只对最后一个元素感兴趣。我计划在以下管道阶段构建一个新对象,例如:

jq '$answer | {bar:.foo, event: .events[-1].msg}`

我都试过了

select(.events[].id != null)

del(.events[], select(.id == null)))

没有运气。

【问题讨论】:

  • 感谢@nurdyguy,但我正在寻找jq 语法。
  • 这不是一个理想的解决方案,但在这种情况下它已经足够好了。
  • 我说的是 jq json 查询工具,而不是 jQuery。
  • 对不起,JSON 格式让我失望了。我已经删除了我的答案。

标签: arrays json jq


【解决方案1】:

我认为您可能正在寻找jq 过滤器,如下所示。表达式.events[] | select(.id == null) 将键返回到id 值为空且del() 删除该键/值对的对象。

jq 'del(.events[] | select(.id == null))'

附带说明,如果您只想通过索引删除元素,您可以使用如下。下面的例子从索引 2 中删除元素,数组实际上是从 0 开始的。

jq 'del( .events[2] )'

但请记住,对于您的原始问题,不建议使用这种方式,因为您不知道键的哪个索引将包含空值。

【讨论】:

    【解决方案2】:

    如有疑问(有时del(...) 有点棘手),您可以随时使用map(select(...)),例如在本例中:

    .events |= map(select(.id != null))
    

    或者甚至:

    .events |= map(select(.id))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2020-06-01
      相关资源
      最近更新 更多