用jmespath通过两个参数求出min和max

find min and max by two parameters with jmespath

本文关键字:参数 min max 两个 jmespath      更新时间:2023-09-26

我有这样的对象,我需要用jmespath 评估哪个"最便宜"

{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}

输出应该是:"a"对象

我在做:

min_by(wines, &price1, &price2).name
min_by(wines, &price1).name
min_by(wines, sum(&price1, &price2)).name

但没有运气

根据你所说的最便宜的意思,如果你想挑选价格1和价格2加在一起的最小值的商品,你可以使用:min_by(wines, &sum([price1,price2])):

$ echo '{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}' | jp 'min_by(wines, &sum([price1,price2]))'
{
    "price2": 1,
    "price1": 50,
    "name": "a"
}

&需要位于第二个参数的开头,因为所需的类型是表达式引用。&sum([price1,price2])表示,对于wines数组中的每个项,计算表达式sum([price1,price2]),并使用所得值来确定数组中的哪个项最小。

另一个例子是,如果您想在葡萄酒列表中选择最低价格的price1price2,您可以将sum替换为min:

$ echo '{
  "wines": [
    {
      "name": "b",
      "price1": 30,
      "price2": 110
    },
    {
      "name": "a",
      "price1": 50,
      "price2": 1
    },
    {
      "name": "c",
      "price1": 40,
      "price2": 1130
    }
  ]
}' | jp 'min_by(wines, &min([price1,price2]))'
{
    "price2": 1,
    "price1": 50,
    "name": "a"
}