将字符串转换为仅包含数值的数组

问题描述 投票:0回答:1

我有下面的 dataweave 代码(可能不是最好的)来检查数组是否包含任何非数字元素。它还检查数组中的项目数。

%dw 2.0
output json
fun isValidElements(arr: Array) =
    arr map ((item) -> item is Number and item != null) reduce ((acc, item) -> acc and item)
fun isValidArray(arr: Array) =
    (sizeOf(arr) > 0) and (isEmpty(arr) or isValidElements(arr))
fun flagInvalidArray(arr: Array) = isValidArray(arr)
var MyArray = [123,456,789]
---
{
    "arrayValid": flagInvalidArray(MyArray),
    "arraySize": if (sizeOf(MyArray) > 1) "Multiple" else "Single"
}

如您所见,这会检查字符串、空值和标志是否有任何数组有效或无效(如果它仅包含数字项,则被认为是有效的)

现在,我需要对字符串数组进行检查。即如果我的输入是这样的

"[123,456,789]"
.

如果我做这样的转换

read(MyArray,"application/json")
,它工作得很好。但是,当我在字符串数组中有任何其他非数字值时,它会失败。我的字符串数组的一些示例:

"[ABC,123,456,789]"
"[123,null,456]"
"[,,,,,%$$$]" -- In cases where there are junk values, we can make the array as empty and flag it as invalid
arrays mule dataweave mule-studio mulesoft
1个回答
1
投票

如果您尝试验证数组的所有元素是否符合条件,则可以使用

every()
模块的
Arrays
函数轻松实现。

我实现这个函数的条件是数组不能为空并且每个元素都是数字。您可以根据需要修改条件。我首先使用 try()/orElse() 将输入字符串读取为 JSON。这只有效,因为 JSON 数字数组与您的输入匹配,但您的输入似乎并不是真正的 JSON。

我添加了一些示例输入来显示结果。

%dw 2.0
output json
import * from dw::core::Arrays
import * from dw::Runtime

fun isValidNumericArray(arr: Array) =
    !isEmpty(arr) and (arr every ((item) -> item is Number))

fun isStringNumericArray(s: String) = 
    try(() -> isValidNumericArray(read(s,"application/json"))) orElse false
 
---
{
    "valid": isStringNumericArray( "[123,456,789]" ),
    "emptyArray": isStringNumericArray( "[]" ),
    "nullItem": isStringNumericArray( "[123,null,456]" ),
    "string": isStringNumericArray( "[ABC,123,456,789]" ),
    "junk": isStringNumericArray("[,,,,,%\$]")
}

输出:

{
  "valid": true,
  "emptyArray": false,
  "nullItem": false,
  "string": false,
  "junk": false
}
© www.soinside.com 2019 - 2024. All rights reserved.