是否有 DataWeave 1.0“for”运算符?

And*_* A. 0 mule dataweave

我想创建与计数变量指定一样多的元素,例如:

有一个表格,其中包含有关支持的设备的信息

select port_count 
from equipment
where id=#[flowVars.equipmentId]
Run Code Online (Sandbox Code Playgroud)

我必须生成一条消息,让另一个不受我控制的系统解释和执行:

<dw:transform-message doc:name="Get value">
    <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
{
  "actions": {
    (for 1..flowVars.port_count map {
      "action": {
        "type": "add_port",
        "id": $$
      }
    })
  }
}]]></dw:set-payload>
</dw:transform-message>
Run Code Online (Sandbox Code Playgroud)

想要的结果:

{
  "actions": {
    "action": {
        "type": "add_port",
        "id": 1
    },
    "action": {
        "type": "add_port",
        "id": 2
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

ale*_*led 5

DataWeave 没有 for 的概念,因为它是一种函数式语言。你仍然可以通过使用范围来代替你想要的:

%dw 1.0
%var port_count=3
%output application/json
---
{
  actions: 
    (((1 to port_count) when port_count > 0 otherwise []) map
      action: {
        "type": "add_port",
        "id": $
      }
    )  reduce ($$ ++ $)
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "actions": {
    "action": {
      "type": "add_port",
      "id": 1
    },
    "action": {
      "type": "add_port",
      "id": 2
    },
    "action": {
      "type": "add_port",
      "id": 3
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

只需更改 flowVar 的 port_count 变量即可。

删除 reduce() 运算符将返回一个列表,这对我来说更有意义。