【问题标题】:Return objects in list that the first name starts with a certain value返回列表中名字以某个值开头的对象
【发布时间】:2022-11-11 19:04:54
【问题描述】:

我正在尝试过滤此对象列表,并仅返回 firstName 以特定值开头的对象。

[
  {"firstName":"Paul","lastName":"Collins"},
  {"firstName":"Jerry","lastName":"Johnson"},
  {"firstName":"Jody","lastName":"Johnson","occupation":"Occupado","company":"Companio"},
  {"firstName":"Paul","lastName":"Johanson","occupation":"Developer","company":"Developer Co"}
]

我得到的最远的是:

([].firstName | [?starts_with(@,'J') == `true`])

返回:

[
  "Jerry",
  "Jody"
]

但是,我想返回符合此条件的整个对象,而不仅仅是 firstName 字段。我想要的输出是:

[
  {"firstName":"Jerry","lastName":"Johnson"},
  {"firstName":"Jody","lastName":"Johnson","occupation":"Occupado","company":"Companio"},
]

我找不到将字符串数组传递给starts_with 的方法。我可以从返回中获取值并将它们插入到多个查询中,一个查询带有一堆"|| firstName == name1 || firstName == name2"。但是我想尝试在一个查询字符串中执行此操作。

有任何想法吗?

【问题讨论】:

  • 请注意 jq 和 JMESPath 是两个完全不同的野兽。您希望使用哪一个?
  • 我可以使用任何一个。我不确定在 jmespath 中是否可行,因此对 jq 中的建议持开放态度。现在已经回答了,我将删除 jq 标签
  • 好吧,现在你有一个问题,因为你有两个不同但有效的答案:)

标签: json jmespath


【解决方案1】:

在 JMESPath 中,如果这是您要查找的内容,filter projection 可以应用于数组的任何属性,只需在选择数组本身的括号中指定所述属性即可。

因此,该属性不是去[].firstName,而是在括号内,例如[?firstName == 'Jerry'],会给你这个人的整个对象杰瑞.

然后你可以使用start_with() 应用它:

[?starts_with(firstName,'J')]

这将产生预期的

[
  {
    "firstName": "Jerry",
    "lastName": "Johnson"
  },
  {
    "firstName": "Jody",
    "lastName": "Johnson",
    "occupation": "Occupado",
    "company": "Companio"
  }
]

【讨论】:

    【解决方案2】:

    使用select( ... ) 过滤流。通过扩展,您可以使用map( select( ... ) ) 从数组中删除项目。

    map( select( .firstName | startswith("J") ) )
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 2020-11-02
      • 2014-11-19
      • 2012-04-25
      • 2015-08-13
      相关资源
      最近更新 更多