通过比较Dataweave 2.0中的两个字符串数组返回一个常见字符串数组

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

我有一个 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函数时无法得到差异

mule dataweave
2个回答
0
投票

Key 需要类型转换为 String。更改以下行以添加

item as String
而不是
item


var matchingWords = keysList reduce (item, acc = []) -> if (keySearch contains (item as String)) acc + item else acc

0
投票

您的脚本有一些问题。主要问题可能是

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"
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.