我有一个 dataweave 脚本,其中使用
keysOf
函数从 inputPayload
返回 JSON 有效负载的键作为 keysList
中的字符串数组。我想将返回的字符串与另一个字符串数组keySearch
进行比较,并将两个数组中的公共字符串视为一个新数组。在这里,我使用 reduce
应用归约来查找公共字符串。
%dw 2.0
var inputPayload = {
"name": "John",
"age": 30,
"hobbies": "reading",
"skills": {
"programming": "Java"
}
}
var keysList = keysOf(inputPayload)
var keySearch = ["activities", "age"]
var matchingWords = keysList reduce (item, acc = []) -> if (keySearch contains item) acc + item else acc
output application/json
---
{
keySearch: keySearch,
keysList: keysList,
difference: matchingWords
}
这里
difference
字段应该打印 [ "age" ]
但目前它返回一个空字符串。如果我手动传递keysList,difference
字段将按预期返回一个数组。
例如: var keysList = [ "name", "age", "married", "hobbies", "skills" ]
keysList
变量具有与 keysOf
函数返回的相同字符串数组。谁能帮我找出为什么我在使用reduce函数时无法得到差异
Key 需要类型转换为 String。更改以下行以添加
item as String
而不是 item
var matchingWords = keysList reduce (item, acc = []) -> if (keySearch contains (item as String)) acc + item else acc
您的脚本有一些问题。主要问题可能是
keysOf()
返回 Key
数组而不是字符串。除非您转换类型,否则可能会导致与 String 的比较失败。相反,使用 namesOf()
更简单,它返回一个字符串数组。
第二点并不是真正的问题,但是以这种方式使用reduce()不是很直观,我想说不太适合像DataWeave这样的函数式语言。对我来说,认为您想要删除不在两个列表中的元素更符合逻辑。这就是一个过滤操作。您只需在数组上使用
filter()
即可。请注意,虽然我说“删除”DataWeave 将始终返回一个删除了元素的新数组。
%dw 2.0
var inputPayload = {
"name": "John",
"age": 30,
"hobbies": "reading",
"skills": {
"programming": "Java"
}
}
var keysList = namesOf(inputPayload)
var keySearch = ["activities", "age"]
output application/json
---
{
keySearch: keySearch,
keysList: keysList,
keysMatching: keysList filter (keySearch contains $)
}
输出:
{
"keySearch": [
"activities",
"age"
],
"keysList": [
"name",
"age",
"hobbies",
"skills"
],
"keysMatching": [
"age"
]
}