首页 > 解决方案 > 如何根据兄弟对象属性中的索引从数组中选择对象?

问题描述

我正在尝试处理一些jq类似于此的 JSON:

[
  {
    "name": "Albert"
  },
  {
    "name": "Brian",
    "parentIndex": 0
  },
  {
    "name": "Carol",
    "parentIndex": 0
  },
  {
    "name": "Dwayne",
    "parentIndex": 2
  },
  {
    "name": "Ethel",
    "parentIndex": 3
  },
  {
    "name": "Francis",
    "parentIndex": 3
  }
]

我想在列表中找到具有特定 的所有对象name,例如"Carol",然后在列表中获取它们的索引,然后使用这些索引来获取列表中的所有对象,这些对象基于它们的parentIndex. 所以,上面应该返回 Dwayne 的对象。

我知道我可以通过以下方式获得索引:

jq '[.[] | .name == "Carol"] | indices(true)'

但不确定如何使用索引将对象从列表中取出。

标签: arraysjsonjqsiblings

解决方案


好的,在为 SO 创建一个更简单的测试用例时想通了。我最终不得不使用一个我以前从未使用过的变量jq。如果您知道没有变量的简单方法,我很想看到它。

以上问题可以通过以下方式解决:

jq '. as $top 
  | .[] 
  | select(
      $top[.parentIndex? | values]
        .name == "Carol"
    )' 

它在每一行上的作用是:

  1. 将初始输入分配给$top。这是必要的,因为在我们评估是否针对select单个对象时,我们不再可以访问没有变量的整个数组。
  2. 将数组拆分为对象流
  3. 选择对象,如果...
  4. ...$top数组中的对象在此对象的位置parentIndex...
  5. ...有name一个"Carol"

推荐阅读