在 DataWeave 中记住并使用之前的迭代值

问题描述 投票:0回答:1

我有一个对象数组。

 [
  {
    "b": 0,
    "a": 5
  },
  {
    "b": 0,
    "a": 10
  },
  {
    "b": 0,
    "a": 15
  }
]

现在我希望 b 的当前值是根据先前对象的“a”和“b”值的总和计算的。 例如,当我使用 map 函数时,我将到达第一个对象。它不会改变,因为它是第一个对象。现在我将到达下一个对象:

{"a":10,"b":0}
所以这里 b 将更新为 5(因为之前的对象“a”为 5 而“b”为 0。所以总和为 5)

现在对于第 3 个对象,即 `{"a":15,"b":0},b 应该更新为 15。因为在之前的迭代中,我已经更新了 b 的值。

我的问题是 DataWeave 映射函数采用的是 b 的未更新值而不是更新值。所以它的产量低于:

[
  {
    "b": 0,
    "a": 5
  },
  {
    "b": 5,
    "a": 10
  },
  {
    "b": 10,
    "a": 15
  }
]

相反,我想要这个输出:

[
  {
    "b": 0,
    "a": 5
  },
  {
    "b": 5,
    "a": 10
  },
  {
    "b": 15,
    "a": 15
  }
]

这是我的剧本

%dw 2.0
output application/json
---
payload map ((item, index) -> {
    b: if (index == 0) 0 else (payload[index - 1].a + payload[index - 1].b),
    a: item.a
})

我不知道如何在每次迭代中获取更新值。任何帮助将不胜感激。

dataweave
1个回答
1
投票

尝试以下解决方案。

在这段代码中,我们使用reduce 遍历数组并累加结果。累加器 acc 有两个属性:b 和 arr。 b 保存着 b 的当前值,arr 保存着我们正在构建的对象数组。

在 reduce 函数中,我们根据 b 的先前值和数组中先前的 a 值更新 b。然后,我们向 arr 数组添加一个新对象,该对象包含 b 的新值和当前 a 值。

最后我们返回累加器的arr属性,里面包含我们构造的对象数组

输入

[
  {
    "b": 0,
    "a": 5
  },
  {
    "b": 0,
    "a": 10
  },
  {
    "b": 0,
    "a": 15
  }
]

数据编织脚本

%dw 2.0
output application/json
---
(payload reduce ((item, acc={b: 0, arr: []}) -> {
    b: if (isEmpty(acc.arr)) 0 else acc.b + acc.arr[-1].a,
    a: item.a,
    arr: acc.arr ++ [{ b: if (isEmpty(acc.arr)) 0 else acc.b + acc.arr[-1].a, a: item.a }]
})).arr

输出

[
  {
    "b": 0,
    "a": 5
  },
  {
    "b": 5,
    "a": 10
  },
  {
    "b": 15,
    "a": 15
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.