是否有可能在JMES Path中获得所有具有最大值的属性的对象?

时间:2019-07-16 08:58:48

标签: javascript json jmespath

(有些精确度:我想要一个完整的JMES Path解决方案,所以我不想使用JavaScript或其他语言来存储变量)

例如,如果我有一个简单的对象,例如:

[  
   {  
      "att1":12,
      "att2":"name1"
   },
   {  
      "att1":15,
      "att2":"name2"
   },
   {  
      "att1":15,
      "att2":"name3"
   },
   {  
      "att1":11,
      "att2":"name4"
   }
]

如果我在此处像这样使用max_by函数:max_by(@,&att1),它将得到以下结果:

{
   "att1": 15,
   "att2": "name2"
}

在这种情况下,只有一个对象,但是我们可以看到至少有2个对象的att1中具有最大值。因此,我尝试了以下代码:@[?att1 == max_by(@,&att1)],但它给了我一个错误。我不知道为什么,所以问题是:

  1. 首先,是否有可能在JMES中(使用任何方式和任何工具)进行操作 路径?
  2. 最后,如果可能的话,该怎么做?

编辑:我认为这是类型问题。例如,如果我使用这段代码type(`4`),它将返回"number",但是如果我使用这段代码type(4)type(to_number(4)),它将给我一个错误

EDIT2:如果我尝试执行以下操作:max_by(@,&att1).att1 == `15`会返回true,但是当我这样做时:
@[?att1 == max_by(@,&att1)]返回错误。我也检查过类型,而这个max_by(@,&att1).att1是一个数字,所以我认为通常不会出现类型错误...

1 个答案:

答案 0 :(得分:0)

要按数字过滤,数字必须用back ticks

包围

var arr = [{"att1":12,"att2":"name1"},{"att1":15,"att2":"name2"},{"att1":15,"att2":"name3"},{"att1":11,"att2":"name4"}]

let maxAtt1 = jmespath.search(arr, "max_by(@,&att1).att1")

console.log(jmespath.search(arr, "[?att1 == `" + maxAtt1 + "`]"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>