我有一组对象。
[
{
"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。所以 sum 是 5)。
接下来,对于第3个对象(即:{"a":15,"b":0})
,b
应该更新为15。因为在之前的迭代中,我已经将b
的值更新为5.
我的问题是 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
}
]