我有一个对象数组。
[
{
"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
})
我不知道如何在每次迭代中获取更新值。任何帮助将不胜感激。
尝试以下解决方案。
在这段代码中,我们使用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
}
]