You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()
}

代码解释

  1. 去重处理:使用$distinct,通过invoiceLink和lineItemNo的组合标识唯一项,过滤掉原输入中重复的4个lineItem,只保留2个唯一项。
  2. 按索引展开:对每个唯一项,先获取数组字段的长度(这里两个数组长度一致),然后遍历每个索引值,生成新对象:
    • 数组字段taxCodeNo和taxCode取对应索引的单个值
    • 非数组字段invoiceLink、lineItemNo直接复用原项的值
  3. 扁平化数组:每个唯一项会生成一个包含2个对象的数组,通过$flatten将所有嵌套数组合并为一个一维数组,得到期望的输出结构。

你之前尝试的问题分析

  • 未处理数组索引的对应关系:只遍历了taxCode数组,但没有同步匹配taxCodeNo的同索引值,导致两个数组字段无法对应。
  • 未过滤重复的lineItem:原输入存在重复项,直接遍历会生成重复结果。
  • 变量引用方式错误:使用$$.taxedLineItems[$i]获取外层值的方式冗余且容易出错,应该直接在$map的回调中使用当前遍历的$item变量访问字段。

内容的提问来源于stack exchange,提问作者Tom Schulte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:52:25