提问人:DanielAttard 提问时间:8/11/2018 更新时间:8/11/2018 访问量:3137
使用 JMESPath 的 JSON 数组值的总和
Sum values of JSON array using JMESPath
问:
我正在尝试使用的功能,但遇到了一些麻烦。我设法弄清楚了如何在多个条件下使用搜索功能。这句话:sum
JMESPath
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)
我不明白如何使用这个功能。有人可以帮忙吗?
答:
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 时?我尝试使用,但出现以下错误:testData
Price
OrderNum
var 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我急忙解释错误,错误是因为结果是嵌套列表引起的,所以你需要使用管道和“平面运算符”来展平列表,然后对它求和。
评论