使用jq将递归下降结果收集到单个数组中

时间:2018-03-21 15:38:55

标签: json jq collect recursive-descent

是否可以将recursive-descent结果收集到jq的单个数组中?

flatten会有帮助吗?看起来对我来说,但我无法让它工作。看看我现在在https://jqplay.org/s/6bxD-Wq0QE的距离,任何人都可以使它工作?

顺便说一句,

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

现在一切都归结为如何过滤掉那些null s?

更新:"收集到一个数组" 我的意思是这样:

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

而不是在所有不同的返回结果中重复相同的name。因此,递归下降似乎是我的选择,但只要我能得到如上所述的结果,我就可以接受任何解决方案。那可能吗?谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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": []
}