получить доступ к индексу элемента внутри функции уменьшения в dataweave 2.0 - PullRequest
1 голос
/ 26 мая 2020

Мой код DataWeave выглядит следующим образом: -

Result: Data reduce (item,ls={}) -> ls ++ From: {dev: item.warehouse}

Есть ли способ проверить индекс объекта элемента. Мне нужно сделать условное выражение на основе индекса объекта элемента.

Пример: Item = Data [0] сделать это;

Result: Data reduce (item,ls={}) -> ls ++ From: {dev: item.warehouse}

Item = Data [1] сделать это;

Result: Data reduce (item,ls={}) -> ls ++ To: {dev: item.warehouse}

Исходный код выглядит следующим образом:

Result : ( Data  reduce (
             item,ls={}) -> ls ++ 
From:{id: "111",(if (item.sign == "333") {status: "OPEN"} else if (item.sign == "444") {status: "HOLD"} else {status: item.sign})}

Мне нужно добавить «От», если индекс элемента нечетный, и добавить «К», если индекс элемента четный. .

Так как у меня нет условия, я всегда получаю «От»

1 Ответ

2 голосов
/ 26 мая 2020

Нет, вы не можете получить доступ к каким-либо индексам, вот документация reduce https://docs.mulesoft.com/mule-runtime/4.1/dw-core-functions-reduce

Что вы можете сделать, так это подсчитать элементы самостоятельно, изменив структуру вашего аккумулятора. : ls={counter=0,data={}}

Теперь вы можете использовать счетчик, чтобы добавлять по одному на итерацию и отслеживать вещи: {counter: ls.counter + 1, data: ls.data ++ To: {dev: item.warehouse}}

Как вы понимаете, вам нужно будет добавить условное выражение, чтобы различать From и To.

Если у меня будет время позже, я сделаю это для вас, или кто-то другой может меня опередить.

EDIT: вот лучшее, что я можно сделать на основе вашего вопроса, но вы должны понять:

%dw 2.0
output application/dw
var inputdata = [{warehouse: 100},{warehouse: 56}, {warehouse:1000}]
---
inputdata reduce (
    (e, acc={c: 0, data: {From: {}, To: {}}}) ->
        {
            c: acc.c+1,
            data: {
                From: if (isEven(acc.c)) (acc.data.From ++ {warehouse: e.warehouse}) else acc.data.From,
                To: if (isEven(acc.c)) acc.data.To else (acc.data.To ++ {warehouse: e.warehouse})
            }
        } 
)

Всегда предоставляйте соответствующие образцы входных и выходных данных вашего преобразования, если вы хотите получить максимальную отдачу от сообщества DW SO;)

...