Mule 4: DW2 - Массив объектов, различающихся по полю объекта - PullRequest
0 голосов
/ 28 марта 2019

Мне нужен массив объектов, которые различаются по определенному полю.Массив уже отсортирован по этому полю, поэтому следует указать, какие поля должны быть удалены: значение предыдущего поля должно отличаться от текущего значения поля.

Например, этот массив

[{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]

должно преобразоваться в

[{A:'1',B:'1'},{A:'2',B:'2'}]

Я пробовал следующее:

%dw 2.0
output application/json
var payload=[{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
---
(payload map (  
    (a,i) ->   ( (a) if payload[i-1].A != $.A  ) 
))

, но это не работает.Если я не использую текущий элемент ($), он работает следующим образом

 (a,i) ->   ( (a) if payload[i-1].A != '2'  ) 

Но мне нужно, чтобы присутствующие и предыдущие элементы присутствовали, чтобы определить, что текущий элемент является новым (не равным предыдущему).

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Вы должны иметь возможность игнорировать тот факт, что ваш массив отсортирован: вам не нужно удобство знать, что текущее значение отличается от предыдущего.Вы можете использовать distinctBy вместо:

%dw 2.0
output application/json

var arr = [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
---
arr distinctBy $.A

Возвраты

[
  {
    "A": "1",
    "B": "1"
  },
  {
    "A": "2",
    "B": "2"
  }
]

Вот документы для distinctBy, если вы заинтересованы: https://docs.mulesoft.com/mule-runtime/4.1/dw-core-functions-distinctby

1 голос
/ 29 марта 2019

Я дам более общий ответ, который будет отличаться не только от «А», но и от «В», потому что в формулировке вопроса неясно, достаточно ли различать только «А». Хотя ваша структура данных пытается различить только «A», в вашем примере только два равных As и нет двух равных B - что является одним конкретным случаем. Поэтому я буду считать, что никакие два As не должны быть равными, и никакие два B не должны быть равными.

Некоторые примеры с желаемыми выходами:

Example(i): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'3',B:'2'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}]
Example(ii): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'2'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}] 
Example(iii): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}]
Example(iv): [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'},{"A":'2',"B":'2'}] ->  [{A:'1',B:'1'},{A:'2',B:'2'}]
  1. Может возникнуть соблазн сделать arr distinctBy ($.A + $.B). Но это будет работать только в случае примера (ii), потому что он будет различаться по объединенным А и В. Пример (i) и пример (iii) останутся без изменений. Пример (iv) преобразуется в [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}].
  2. Таким образом, чтобы достичь заявленной цели, нет двух As равных и нет двух B, равных, мы должны сначала отличить «A», затем отличить «B», а затем найти общий перекрывающийся массив между ними. Поэтому я использую фильтр и содержит для достижения этого, как показано ниже:
%dw 2.0
output application/json
var arr = [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
---
(arr distinctBy $.A) filter ((arr distinctBy $.B) contains $)
...