使用JSONata实现按time匹配并计算value/value_2的结果
JSONata:按时间合并二维数组并计算比值
输入数据
[[ { "time": "2024-04-26", "value": 40 }, { "time": "2024-04-27", "value": 10 }, { "time": "2024-04-28", "value": 20 } ], [ { "time": "2024-04-26", "value_2": 5 }, { "time": "2024-04-27", "value_2": 2 }, { "time": "2024-04-28", "value_2": 4 } ]]
需求
提取唯一的time值,将对应value与value_2做除法运算,生成包含time和计算后结果的对象数组。
错误尝试及问题分析
你使用的原表达式:
$type($) = 'array' ? (($count($) ) > 0 ? $map($[0], function($v, $i, $a) { { "time": $v.time, "value": $v.value/ $v.value_2 } })[]: []): undefined
输出仅保留time字段的原因是:遍历的是第一个子数组$[0],其中的对象只有value属性,没有value_2,$v.value_2为undefined,导致除法结果失效,最终仅保留了存在的time字段。
正确表达式
方案一(适用于两个子数组time顺序完全一致)
$map($[0], function($item, $index) { { "time": $item.time, "value": $item.value / $[1][$index].value_2 } })
逻辑说明
- 遍历第一个子数组的每个元素,通过遍历索引
$index直接匹配第二个子数组对应位置的元素 - 取出对应位置的
value和value_2进行除法计算,生成目标对象
方案二(通用版,适用于time顺序不一致的场景)
如果两个子数组的time顺序可能不同,用$lookup按time精准匹配:
$merge([$[0], $[1]]){ "time": $, "value": $lookup($[0], "time", $).value / $lookup($[1], "time", $).value_2 } ~> $sort("time")
逻辑说明
- 合并两个子数组的所有对象
- 按
time字段分组,对每组取出对应value和value_2计算比值 - 最后按
time排序,保证输出顺序统一
验证输出
两种方案均可得到你期望的结果:
[ { "time": "2024-04-26", "value": 8 }, { "time": "2024-04-27", "value": 5 }, { "time": "2024-04-28", "value": 5 } ]
内容的提问来源于stack exchange,提问作者Imaginary-Pea
相关产品推荐
相关产品推荐

