无法在循环中获取先前更新的元素的新值

问题描述 投票: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。所以 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
    })

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

dataweave
1个回答
2
投票

尝试以下解决方案。

在这段代码中,我们使用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.