首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据属性值在数组中选择项

根据属性值在数组中选择项
EN

Stack Overflow用户
提问于 2020-05-25 17:37:15
回答 1查看 81关注 0票数 2

作为开发人员,当我使用以下JQ命令时:

.first_level."second_level"[] |= select(.fruit == "pear")

我将它应用于这个JSON:

代码语言:javascript
复制
{
  "first_level": {
    "second_level": [
      {
        "fruit": "apple"
      },
      {
        "fruit": "pear"
      },
      {
        "fruit": "banana"
      },
      {
        "fruit": "donuts"
      }
    ]
  }

}

然后,我希望有这个输出(只保留属性fruitpear相等的项):

代码语言:javascript
复制
{
  "first_level": {
    "second_level": [
      {
        "fruit": "pear"
      }
    ]
  }

}

但是返回的当前值是(也可以在JQ 这里中看到):

代码语言:javascript
复制
{
  "first_level": {
    "second_level": [
      {
        "fruit": "pear"
      },
      {
        "fruit": "donuts"
      }
    ]
  }
}

->它保留了donuts的值,我不明白的是,在JQ文档中,|=应该指定所选内容的值,但在运行时:

.first_level."second_level"[] \x{e76f}选择(.fruit == "pear")

我的结果如下:

代码语言:javascript
复制
{
  "fruit": "pear"
}

如果能在这个问题上提供任何帮助,我们将不胜感激。谢谢!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 17:52:02

给定您的示例输入,该程序所做的基本工作如下:

代码语言:javascript
复制
.first_level.second_level |= (
    delpaths([[0]]) # apple != pear
  | delpaths([[1]]) # banana != pear
  | delpaths([[2]]) # null != pear
  | delpaths([[3]]) # null != pear
)

查看|=的底层构建是如何实现这里的;当|=的右侧应用于路径的值时,如果结果是empty,则通过delpaths删除该路径。所以问题很明显,当.[0] (苹果)被删除时,.[1] (pear)变成了.[0];但是_modify没有考虑到这种变化,因为它在开始时会考虑要修改一次的路径列表,并且不会再次更新,并继续使用.[1] (香蕉)。

你可以用这个代替:

代码语言:javascript
复制
del(.first_level.second_level[] | select(.fruit != "pear"))

或者如果您坚持一个涉及|=的解决方案

代码语言:javascript
复制
.first_level.second_level |= map(select(.fruit == "pear"))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62007725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档