请注意,此帖子已标记为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)))
没有运气。
答案 0 :(得分:2)
我认为您可能正在寻找jq
过滤器,如下所示。表达式.events[] | select(.id == null)
返回id
值为空且del()
删除该键/值对的对象的键。
jq 'del(.events[] | select(.id == null))'
作为旁注,如果您只想按索引删除元素,可以使用如下方法。下面的示例从索引2中删除元素,该数组实际上从0开始。
jq 'del( .events[2] )'
但是请记住,建议不要使用这种方法来处理原始问题,因为您不知道密钥的哪个索引包含空值。
答案 1 :(得分:0)
如果有疑问(有时del(...)
有点棘手),您可以随时使用map(select(...))
,例如在本案中:
.events |= map(select(.id != null))
或者甚至是:
.events |= map(select(.id))