请注意,这篇文章被标记为jq,我根本不想用 javascript 来做到这一点。
我有一个对象,它的字段之一是数组。我想从对象的数组中删除与条件匹配的元素,但保留该对象。我环顾四周,只能发现仅返回现在项目较少的数组的片段。
这是一个例子:
{
"foo": "bar",
"events": [
{
"id": 1,
"msg": "starting"
},
{
"id": 2,
"msg": "working on it"
},
{
"id": null,
"msg": "done"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想返回以下信息:
{
"foo": "bar",
"events": [
{
"id": 1,
"msg": "starting"
},
{
"id": 2,
"msg": "working on it"
}
]
}
Run Code Online (Sandbox Code Playgroud)
注意:以防万一这会影响答案,我真的只对最后一个元素感兴趣。我计划在以下管道阶段构建一个新对象,例如:
jq '$answer | {bar:.foo, event: .events[-1].msg}`
Run Code Online (Sandbox Code Playgroud)
我都尝试过
select(.events[].id != null)
Run Code Online (Sandbox Code Playgroud)
和
del(.events[], select(.id == null)))
Run Code Online (Sandbox Code Playgroud)
没有运气。
我想您可能正在寻找jq如下过滤器。该表达式返回值为 null 的.events[] | select(.id == null)对象的键并删除该键/值对。iddel()
jq 'del(.events[] | select(.id == null))'
Run Code Online (Sandbox Code Playgroud)
作为旁注,如果您只想通过索引删除元素,您可以使用如下所示。下面的示例从索引 2 中删除元素,数组实际上从 0 开始。
jq 'del( .events[2] )'
Run Code Online (Sandbox Code Playgroud)
但请记住,对于您的原始问题,不建议使用这种方法,因为您不知道键的哪个索引将包含空值。