【问题标题】:Use jq to collect recursive-descent results into a single array使用 jq 将递归下降结果收集到单个数组中
【发布时间】:2018-03-21 15:38:55
【问题描述】:

是否可以使用jqrecursive-descent 结果收集到单个数组中?

flatten 会帮忙吗?在我看来是这样,但我就是无法让它工作。看看我现在在https://jqplay.org/s/6bxD-Wq0QE 有多远,任何人都可以让它工作吗?

顺便说一句,

  • .data.search.edges[].node | {name, topics: ..|.topics?} 有效,但我希望来自同一节点的所有主题都在一个数组中,而不是在所有不同的返回结果中具有相同的 name
  • flatten 一个人会给我Cannot iterate over null,并且
  • 这就是我尝试使用map(select(.? != null)) 过滤nulls 的原因。但是,我的map-select 也会得到Cannot iterate over null

所以现在一切都归结为如何过滤掉那些nulls?

更新:“收集到单个数组中”我的意思是得到这样的东西:

[
  {
    "name": "leumi-leumicard-bank-data-scraper",
    "topics": ["banking", "leumi", "api", "puppeteer", "scraper", "open-api"]
  }
]

而不是在所有不同的返回结果中重复相同的name。因此,在我看来,递归下降似乎是一种选择,但只要我能得到上述结果,我对任何解决方案都持开放态度。那可能吗?谢谢。

【问题讨论】:

  • 发布最终预期结果
  • 请遵循 stackoverflow.com/help/mcve 上的指南

标签: json jq collect recursive-descent


【解决方案1】:

一种收集非虚假值的方法:

.data.search.edges[].node 
| {name, topics: [.. | .topics? | select(.)]}

结果是:

{
  "name": "leumi-leumicard-bank-data-scraper",
  "topics": [
    "banking",
    "leumi",
    "api",
    "puppeteer",
    "scraper",
    "open-api"
  ]
}
{
  "name": "echarts-scrappeteer",
  "topics": []
}

【讨论】:

    【解决方案2】:

    不确定您希望在结果中得到什么...但您似乎正在尝试将所有存储库及其主题放在一个平面数组中。我看不出你应该在这里使用递归的任何理由,你只是从一类对象中选择。直接引用即可。

    [.data.search.edges[].node | {name,topic:(.repositoryTopics.nodes[].topic.topics)}]
    

    对于您的特定输入产生:

    [
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "banking"
      },
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "leumi"
      },
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "api"
      },
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "puppeteer"
      },
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "scraper"
      },
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": "open-api"
      }
    ]
    

    https://jqplay.org/s/G2inYAJNLS


    如果您想在节点中包含一个主题数组,只需将选择主题的过滤器放在[] 中,将它们收集到一个数组中。

    [.data.search.edges[].node | {name,topic:[.repositoryTopics.nodes[].topic.topics]}]
    
    [
      {
        "name": "leumi-leumicard-bank-data-scraper",
        "topic": [
          "banking",
          "leumi",
          "api",
          "puppeteer",
          "scraper",
          "open-api"
        ]
      },
      {
        "name": "echarts-scrappeteer",
        "topic": []
      }
    ]
    

    https://jqplay.org/s/0AFneNK89i

    【讨论】:

    • 非常感谢您的理解和帮助杰夫!我编辑了我的 OP 以明确我想要什么,但后来注意到@peak 的答案已经给出了正确的解决方案。再次感谢您的帮助杰夫!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2016-04-25
    相关资源
    最近更新 更多