通过数组搜索

Searching through an array

尝试学习如何在 jq 脚本中思考。

鉴于此数据:

{
   "characters": [
       { "First": "Fred", "Last": "Weasley" },
       { "First": "George", "Last": "Weasley" },
       { "First": "Hermione", "Last": "Granger" },
       { "First": "Ron", "Last": "Weasley" },
       { "First": "Hagrid" },
       { "First": "Draco", "Last": "Malfoy" },
       { "First": "Molly", "Last": "Weasley" },
       { "First": "Voldemort" },
       { "First": "Lucius", "Last": "Malfoy" }
    ]
}

找出所有姓氏与“罗恩”相同的角色。不,你还不知道他的姓氏。

您有一个名为“字符”的对象数组,每个对象都包含一个“第一个”和“最后一个”变量。 现在得到第一个。 Go characters[0].first 会 return。 “弗雷德” 或者 characters.[3].last 会 return "Weasley" 请注意,数组中的第一个条目是通过索引 0 获取的。 有道理吗?

找到您要查找的姓​​氏并将其保存在变量中,然后相应地更新 characters 数组:

jq '
  (.characters[] | select(.First == "Ron").Last) as $last
  | .characters |= map(select(.Last == $last))
'
{
  "characters": [
    {
      "First": "Fred",
      "Last": "Weasley"
    },
    {
      "First": "George",
      "Last": "Weasley"
    },
    {
      "First": "Ron",
      "Last": "Weasley"
    },
    {
      "First": "Molly",
      "Last": "Weasley"
    }
  ]
}

Demo


如果您想使用动态名字进行调用,请使用参数变量提供它:

jq --arg first "Ron" '
  (.characters[] | select(.First == $first).Last) as $last
  | .characters |= map(select(.Last == $last))
'