Точное совпадение по значению в объекте / массиве - PullRequest
0 голосов
/ 18 июня 2019

У меня проблема с подсчетом числа вхождений строки из массива в поле объекта.

В приведенном ниже XML-файле содержится 3 элемента 'Level3' с 1 полем 'TextLine' в каждом.

Мне нужно посчитать, сколько раз каждый текст в переменной «тексты» встречается в полезной нагрузке.

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

Так что вместо того, чтобы считать: 2, я получил счет: 3, потому что 'текст 'является подстрокой' Это текст '

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 Ответ

2 голосов
/ 18 июня 2019

Один из способов сделать это - подсчитать вхождения для каждого текста, сгруппировать их по значению и подсчитать, сколько элементов в каждой группе.А затем измените ваш 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
}

Примечание.создание нового.

...