对象/数组中的值完全匹配

时间:2019-06-18 06:47:45

标签: mule dataweave

在计算对象字段中数组中字符串出现的次数时遇到问题。

下面的XML有3个“ Level3”项,每个项有1个“ TextLine”字段。

我需要计算变量'texts'中的每个文本在有效载荷中出现的次数。

fun getVasCount(texts) = 
    sizeOf (Level1.*Level2.*Level3.*TextLine filter (texts contains $))

所以没有得到count:2我得到了count:3,因为'a text'是'This is a text'的子字符串

var texts = {
    "This is a text": "",
    "This is another text": ""
}

<?xml version="1.0" encoding="UTF-8"?>
<ns:Level1
    xmlns:ns="aaaa:bbbb:cccc:dddd">
    <Level2>
        <Level3>
            <TextLine>This is a text</TextLine>
        </Level3>
        <Level3>
            <TextLine>This is a text</TextLine>
        </Level3>
        <Level3>
            <TextLine>a text</TextLine>
        </Level3>
    </Level2>
</ns:Level1>

1 个答案:

答案 0 :(得分:2)

一种方法是计算每个不同文本的出现次数,这些文本按值分组,并计算每个组中有多少个元素。 然后使用计数修改您的texts对象。

%dw 2.0
output application/json
var texts = {
    "This is a text": "",
    "This is another text": ""
}
var textLines = payload.Level1.*Level2.*Level3.*TextLine default []
var grouped = textLines 
    groupBy $ 
    mapObject (groupValues, text) -> {(text): sizeOf(groupValues)}
---
texts mapObject {($$): grouped[$$] default 0}

结果将是:

{
  "This is a text": 2,
  "This is another text": 0
}

注意:由于对象是不可变的,因此并没有真正修改texts,而是创建了一个新对象。