如何使用JSONata展平含双数组值的对象并按索引匹配元素?
解决方案:展平包含数组字段的对象并按索引匹配值
实现代码(JSONata)
{ "taxedLineItems": $.taxedLineItems // 第一步:去重重复的lineItem(根据invoiceLink+lineItemNo组合判断) .$distinct(function($v) { return $v.invoiceLink & "|" & $v.lineItemNo }) // 第二步:遍历每个去重后的项,按数组索引展开 .$map(function($item) { // 基于数组长度生成索引序列,遍历每个索引 $length($item.taxCodeNo).$map(function($idx) { { "taxCodeNo": $item.taxCodeNo[$idx], "invoiceLink": $item.invoiceLink, "lineItemNo": $item.lineItemNo, "taxCode": $item.taxCode[$idx] } }) }) // 第三步:扁平化嵌套数组,得到最终一维结果数组 .$flatten() }
代码解释
- 去重处理:使用
$distinct,通过invoiceLink和lineItemNo的组合标识唯一项,过滤掉原输入中重复的4个lineItem,只保留2个唯一项。 - 按索引展开:对每个唯一项,先获取数组字段的长度(这里两个数组长度一致),然后遍历每个索引值,生成新对象:
- 数组字段
taxCodeNo和taxCode取对应索引的单个值 - 非数组字段
invoiceLink、lineItemNo直接复用原项的值
- 数组字段
- 扁平化数组:每个唯一项会生成一个包含2个对象的数组,通过
$flatten将所有嵌套数组合并为一个一维数组,得到期望的输出结构。
你之前尝试的问题分析
- 未处理数组索引的对应关系:只遍历了
taxCode数组,但没有同步匹配taxCodeNo的同索引值,导致两个数组字段无法对应。 - 未过滤重复的lineItem:原输入存在重复项,直接遍历会生成重复结果。
- 变量引用方式错误:使用
$$.taxedLineItems[$i]获取外层值的方式冗余且容易出错,应该直接在$map的回调中使用当前遍历的$item变量访问字段。
内容的提问来源于stack exchange,提问作者Tom Schulte
相关产品推荐
相关产品推荐

