【问题标题】:filter and range with map are not working带有地图的过滤器和范围不起作用
【发布时间】:2020-03-04 06:38:03
【问题描述】:

我需要遍历一个列表,但只从该列表中提取前两个元素。

我写了以下代码

payload.list.*listItem filter ($.type == "supervisor") map {

// other code

}

这工作得很好。然后我修改它以仅像这样提取前两个元素

payload.list.*listItem filter ($.type == "supervisor") [0 to 1] map {

// other code

}

它不再起作用了。我没有收到任何错误,但其他代码不起作用,就好像地图操作员没有什么可做的一样。

如果在应用过滤器后只有一个元素,我还需要使其适用于某个场景。 我应该如何更改我的代码以使其正常工作。

【问题讨论】:

  • 请添加输入和预期输出。
  • 并添加完整的 dataweave 脚本,包括“---”上方以及您使用的 dataweave 版本。
  • 通过示例输入和预期输出发布问题符合您的最大利益..

标签: mule anypoint-studio dataweave mulesoft


【解决方案1】:

范围选择器必须直接在数组上使用,因此您只需要正确地进行选择:

(payload.list.*listItem filter ($.type == "supervisor"))[0 to 1] map {

// other code

}

【讨论】:

  • 但这就是我所做的。它在部署过程中没有给我任何错误,但在运行时会爆炸。此外,如果过滤器的输出只有 1 个元素,[0 到 1] 仍然可以工作,或者它会抛出一个超出索引的错误......?
  • 你试过了吗?我认为@afelisatti 使用括号来确保将范围选择器应用于正确的值。
  • 如果过滤器的输出只有1个元素,[0到1]选择器将返回null。在这种情况下,您可以使用 If 语句检查过滤器返回的大小(我将为该 filterOutput 创建一个变量)或在范围选择器之后使用默认的 [filterOutput[0]](如果选择器返回 null,它将选择 filterOutput 的第一个元素)
  • 我完全忽略了周围的额外一对 ()。道歉。现在可以正常使用了。
【解决方案2】:

您需要添加括号以确保优先级。另外,我很惊讶它对你有用。我需要将“类型”放在单引号中以使其正常工作,因为这是一个 dataweave 关键字。我这样做了?($$<2) 而不是[0 to 1],因为我不确定您是否保证在过滤器的输出中至少有两个对象。如果你知道,你至少会有两个,保持原来的样子。

(payload.list.*listItem filter ($.'type' == "supervisor"))[?($$<2)] map (value, index) -> 
    {
        "key":value
    }

这里有一个 link 到 Dataweave 的优先级文档。它吸引了很多人。在大多数情况下使用括号更安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多