如何从包含值的JSON对象中删除数组元素

3
请注意,此帖子标记为jq,我并不打算完全使用javascript。
我有一个对象,其中一个字段是数组。我想从对象的数组中删除符合某些条件的元素,但仍保留该对象。我已经搜索过了,只能找到返回现在少了一些项目的数组片段的代码片段。
以下是一个示例:
{
  "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)))

没有运气。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete - nurdyguy
谢谢@nurdyguy,但我正在寻找jq语法。 - mmlb
这不是一个理想的解决方案,但对于这种情况来说已经是最好的了。 - nurdyguy
我在谈论的是jq这个JSON查询工具,而不是jQuery。 - mmlb
抱歉,JSON 格式让我困扰了。我已经删除了我的答案。 - nurdyguy
2个回答

5

我想您可能正在寻找以下jq过滤器。表达式.events[] | select(.id == null)返回id值为null的对象中的键,del()删除该键/值对。

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

顺便提一下,如果你只想通过索引删除一个元素,你可以按照下面的方式使用。下面的例子删除了从索引2开始的元素,数组实际上从0开始。

jq 'del( .events[2] )'

但请记住,这种方法不推荐用于解决您的根本问题,因为您无法确定您的键的哪个索引包含空值。

0

如果有疑问(有时del(...)有点棘手),您总是可以使用map(select(...)),例如在当前情况下:

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

或者甚至更好:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接