使用 JMESPath 的 JSON 数组值的总和

Sum values of JSON array using JMESPath

提问人:DanielAttard 提问时间:8/11/2018 更新时间:8/11/2018 访问量:3137

问:

我正在尝试使用的功能,但遇到了一些麻烦。我设法弄清楚了如何在多个条件下使用搜索功能。这句话:sumJMESPath

var x = search(myData, "Account[].Details[? Year=='2018' && Title=='ABC'].Amount");

返回以下 JSON 数组:

["2404.00", "2404.00", "2402.67", "2699.00", "2699.00", "2698.49"]

现在我想做的是将这些值相加。JMESPath 规范说要对内置函数使用以下语法:sum

number sum(array[number] $collection)

我不明白如何使用这个功能。有人可以帮忙吗?

数组 JSON jmespath

评论


答:

2赞 BJT 8/11/2018 #1

我采用了您上一个示例并添加了更多示例数据,我们将对价格求和

const testData =
{
"ServiceAccount": [
    {
        "Type": "WIDGET",
        "ID": [
            {
                "OrderNum": "12345",
                "OrderTyp": "ABDCD",
                "Price": "10",
            }
        ]
      },
      {
        "Type": "WIDGET",
        "ID": [
            {
                "OrderNum": "22345",
                "OrderTyp": "ZBDCD",
                "Price": "20",
            }
        ]
      },
      {
        "Type": "WIDGET",
        "ID": [
            {
                "OrderNum": "22385",
                "OrderTyp": "ZBDXD",
                "Price": "30",
            }
        ]
      }
    ]
};

const result = jmespath.search(testData, 'sum(ServiceAccount[].ID[].Price.to_number(@))');

console.log(result);

   
<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.min.js"></script>

那么你当前问题的答案将是这样的:

var x = search(myData, "sum(Account[].Details[? Year=='2018' && Title=='ABC'].Amount.to_number(@))");

评论

0赞 DanielAttard 8/11/2018
使用这个问题,我们如何对值求和,只有当 > 20000 时?我尝试使用,但出现以下错误:testDataPriceOrderNumvar x = search(myData, "sum(Account[].Details[? OrderNum> 20000].Price.to_number(@))");Uncaught Error: TypeError: sum() expected argument 1 to be type 8 but received type 3 instead.
1赞 BJT 8/11/2018
@DanielAttard如下: var x = search(myData, “sum(Account[].查看详情[?OrderNum> 20000]。价格 |[].to_number(@))“)
1赞 BJT 8/11/2018
@DanielAttard我急忙解释错误,错误是因为结果是嵌套列表引起的,所以你需要使用管道和“平面运算符”来展平列表,然后对它求和。