Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
develop:mule:dataweave [2024/02/25 12:21] mirocowdevelop:mule:dataweave [2024/03/06 22:19] (текущий) – [Ссылки] mirocow
Строка 17: Строка 17:
 payload payload
 </code> </code>
 +
 +<note tip>IDE https://dataweave.mulesoft.com/learn/playground</note>
 +===== Oprators =====
 +
 +  * using: For initializing local variables in a DataWeave script.
 +  * Unary DataWeave operators at this level:
 +    * .^: Schema selector.
 +    * .#: Namespace selector.
 +    * ..: Descendants selector. 
 +    * not: Logical operator for negation.
 +    * .@: All attribute selector, for example, in a case that uses the expression payload.root.a.@ to return the attributes and values of the input payload <root> <a attr1="foo" attr2="bar" /></root> within the array of objects { "attr1": "foo", "attr2": "bar" }.                                                                                                                                                                                                                                              
 +==== Condition ====
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{
 +    "result": if (vars.myVar == null) "myVar is null" else "myVar has a value set"
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myVar = { country : "India" }
 +output application/json
 +---
 +if (myVar.country == "UAE")
 +  { currency: "EUR" }
 +else { currency: "RUPEES" }
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var user = {"firstName": "Manik", "lastName": "Magar", "Address Line1" : "Address line 1"}
 +---
 +name : user mapObject {
 + ('$$' : '$') when ($ contains 'Ma')
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +var aRecord =
 + [
 +    "bookId":"101",
 +    "title":"world history",
 +    "price":"19.99"
 + ]
 +output application/xml
 +---
 +{ examples:
 +    {
 +       ex1 : if (1 + 1 == 55) true
 +             else false,
 +       ex2 : if ([1,2,3,4][1] == 1) 1
 +             else "value of index 1 is not 1",
 +       ex3 : if (isEmpty(aRecord.bookId)) "ID is empty"
 +         else "ID is not empty",
 +       ex4 : aRecord.bookId map (idValue) -&gt;
 +         if (idValue as Number == 101) idValue as Number
 +         else "not 101"
 +    }
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var user = {"firstName": "Manik", "lastName": "Magar", "Address Line1" : "Address line 1"}
 +---
 +name : user filter ($ contains "Ma")
 +</code>
 +
 +==== Filters ====
 +
 +
 +
 +
 +
 +
 +==== Functions ====
 +
 +  * Named functions
 +  * Lambdas
 +  * Passing functions to other functions
 +  * Calling 2-arity functions with infix notation
 +  * $, $$, $$$ syntax
 +
 +=== Лямда функции / Functions as Values ===
 +
 +Полезность лямбд становится очевидной, когда мы объединяем две идеи:
 +
 +  * Лямбды — это значения, такие же, как строки, объекты и логические значения.
 +  * Значения могут передаваться функциям в качестве аргументов, а также возвращаться из функций.
 +
 +В DataWeave функции и лямбды (анонимные функции) могут передаваться как значения или присваиваться переменным. 
 +
 +DataWeave предоставляет несколько способов создания функций. Точно так же, как у нас есть именованные функции, у нас есть функции без имен, называемые лямбда-выражениями. Лямбда — это значение в DataWeave, такое же, как строка, объект и логическое значение. При использовании лямбда-выражений в теле файла DataWeave в сочетании с такой функцией, как карта, его атрибутам можно либо дать явное имя, либо оставить анонимным, и в этом случае на них можно ссылаться как $, $$ и т. д.
 +
 +<note tip>Другими словами, лямбды становятся полезными, когда вы хотите передать функции в качестве аргументов другим функциям или вернуть функцию из функции.</note>
 +
 +<code>
 +%dw 2.0
 +output json
 +
 +fun isOddNum(n) =
 +  (n mod 2) == 1
 +
 +// Generate [1, 2, ..., 5]
 +var numbers = (1 to 5)
 +---
 +filter(numbers, (n, idx) -> isOddNum(n))
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +
 +var numbers = (1 to 5)
 +---
 +filter(numbers, (n, idx) -> (n mod 2) == 1)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +(() -> 2 + 3)()
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var toUser = (user) -> {
 +  firstName: user.field1,
 +  lastName: user.field2
 +}
 +---
 +{
 +  "user" : toUser(payload)
 +}
 +</code>
 +
 +=== Логические операторы / Logical Operators ===
 +
 +  * A > B Greater than
 +  * A < B Less than
 +  * A >= B Greater than or equal to
 +  * A <= B Less than or equal to
 +  * A == B Equal to
 +  * A != B Not equal to
 +  * A ~= B Similar to
 +  * not A Logical negation
 +  * !A Logical negation
 +  * A and B Logical and
 +  * A or B Logical or
 +  * not Negates the result of the input. See also, !.
 +  * ! Negates the result of the input. See also, not. Introduced in DataWeave 2.2.0. Supported by Mule 4.2 and later.
 +  * and Returns true if the result of all inputs is true, false if not.
 +  * or Returns true if the result of any input is true, false if not.
 +
 +<code>
 +%dw 2.0
 +output json
 +var age = 2
 +---
 +age < 10
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myArray = [1,2,3,4,5]
 +var myMap = myArray map not (($ mod 2) == 0)
 +output application/json
 +---
 +{
 +  "not" : [
 +    "notTrue" : not true,
 +    "notFalse" : not false,
 +    "myMapWithNot" : myMap
 +  ],
 +  "and" : [
 +    "andTrueFalse" : true and false,
 +    "andIsTrue" : (1 + 1 == 2) and (2 + 2 == 4),
 +    "andIsFalse" : (1 + 1 == 2) and (2 + 2 == 2)
 +  ],
 +  "or" : [
 +    "orTrueFalse" : true or false,
 +    "orIsTrue" : (1 + 1 == 2) or (2 + 2 == 2),
 +    "orIsFalse" : (1 + 1 == 1) or (2 + 2 == 2)
 +  ],
 +  "!-vs-not" : [
 +      "example-!" : (! true or true),
 +      "example-not" : (not true or true)
 +  ]
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +var orNot = if (1 + 1 == 4 or not 1 == 2) {"answer": "orNot - Condition met"}
 +             else {"answer": "nope"}
 +var andNot = if (1 + 1 == 2 and not 1 == 2) {"answer": "andNot - Condition met"}
 +             else {"answer": "nope"}
 +var notWithAndNot = if (not (1 + 1 == 2 and not 1 == 1)) {"answer": "notWithAndNot - Condition met"}
 +              else {"answer": "nope"}
 +output application/json
 +---
 +{ "answers" :
 +  [
 +    orNot,
 +    andNot,
 +    notWithAndNot
 +  ]
 +}
 +</code>
 +
 +=== Types ===
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{
 +  /*
 +   * A multi-line
 +   * comment here.
 +   */
 +  myString: "hello world",
 +  myNumber: 123,
 +  myFloatingPointNumber: 123.456,
 +  myVeryBigNumber: 12341234134123412341234123,
 +  myDate: |2018-12-07|,
 +  myTime: |11:55:56|,
 +  myDateTime: |2018-10-01T23:57:59-03:00|,
 +  myBoolean: true,
 +  myArray: [ 1, 2, 3, 5, 8],
 +  myMixedArray: [ 1, 2, "blah", { hello: "there" } ],
 +  myObjectKeyValuePair: { innerKey: "innerValue" },
 +  myObjectWithConditionalField: { a : { b : 1, ( c : 2 ) if true, (d : 4) if false } },
 +  myNull: null,
 +  myBinary: "abcd1234123" as Binary
 +  //A one-line comment here.
 +}
 +</code>
 +===== dw::* =====
  
 ==== dw::core::Arrays / Working with Array ==== ==== dw::core::Arrays / Working with Array ====
Строка 40: Строка 288:
   * **takeWhile** Selects elements from the array while the condition is met but stops the selection process when it reaches an element that fails to satisfy the condition.   * **takeWhile** Selects elements from the array while the condition is met but stops the selection process when it reaches an element that fails to satisfy the condition.
  
 +=== divideBy ===
 +
 +<code>
 +%dw 2.0
 +import divideBy from dw::core::Objects
 +output application/json
 +---
 +{ "a": 1, "b": true, "a": 2, "b": false, "c": 3 } divideBy 2 
 +</code>
 +=== drop ===
 +
 +<code>
 +%dw 2.0
 +import * from dw::core::Arrays
 +var samplearray = ["124", "35454", "Sachin","Amit"]
 +output application/json
 +---
 + 
 +drop(samplearray, 2)
 +</code>
 +
 +=== indexOf ===
 +
 +<code>
 +%dw 2.0
 +import * from dw::core::Arrays
 +var samplearray = ["124", "35454", "Sachin","Amit"]
 +output application/json
 +---
 + 
 +indexOf(samplearray, "Sachin")
 +</code>
 +
 +=== join ===
 +
 +<code>
 +%dw 2.0
 +import * from dw::core::Arrays
 + 
 +var items = [{id: "12", name:"Tea"},{id: "22", name:"Salt"},{id: "3", name:"Soap"},{id: "5", name:"Butter"}]
 + 
 +var Prices = [{Id: "12", price:123},{Id: "3", price:24}, {Id: "22", price:20}, {Id: "4", price:456}]
 + 
 +output application/json
 +---
 +join(items, Prices, (item) -> item.id, (price) -> price.Id)
 +
 +</code>
 +=== takeWhile ===
 +
 +
 +<code>
 +%dw 2.0
 +import * from dw::core::Arrays
 +output application/json
 +var arr = [1,2,3,4,1,2]
 +---
 + 
 +arr takeWhile $ &lt;= 2
 +
 +</code>
 +
 +<code>
 +%dw 2.0
 +import * from dw::core::Objects
 +output application/json
 +var obj = {
 +  "a": 1,
 +  "b": 2,
 +  "c": 5,
 +  "d": 1
 +}
 +---
 +obj takeWhile ((value, key) ->  value < 3)
 +</code>
 ==== dw::Core ==== ==== dw::Core ====
  
 +=== distinctBy ===
 +
 +Выполняет итерацию по массиву и возвращает уникальные элементы в нем. DataWeave использует результат применения предоставленной лямбды в качестве критерия уникальности. Эта версия DifferentBy находит уникальные значения в массиве. Другие версии действуют на объект и обрабатывают нулевое значение.
 +
 +Эта функция полезна, когда вам нужно удалить повторяющиеся элементы из массива
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload distinctBy $.id
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var str = [1,2,3,4,5,6,7]
 +var str1= [4,5,6,7,1]
 +---
 +(str ++ str1) distinctBy ((item, index) ->item )
 +</code>
 +
 +=== Filter Arrays ===
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{
 +    id: payload.Id,
 +    markCode: payload.marketCode,
 +    languageCode: payload.languageCode,
 +    username: payload.profile.base.username,
 +    phoneNumber: (payload.profile.base.phone filter ($.activeInd == "Y" and $.primaryInd== "Y")).number default []
 +}
 +</code>
 +
 +Infix Notation: Long-Hand
 +<code>
 +[ ] filter (value, index) -> (condition)  
 +</code>
 +
 +Infix Notation: $ syntax 
 +<code>
 +[ ] filter (<condition using $, $$>
 +</code>
 +
 +Prefix Notation
 +<code>
 +filter([ ], (value, index) -> (condition))
 +</code>
 +
 +Filter Expression
 +<code>
 +[ ]  [? (<boolean_expression>) ]
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +["AAPL", "MSFT", "NVDA", "TSLA", "CRM", "GOOG", "GOOGL"]
 +filter 
 +(value) -> (value contains "GO")
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +["AAPL", "MSFT", "NVDA", "TSLA", "CRM", "GOOG", "GOOGL"]
 +filter
 +(value, index) -> ((index mod 2) == 0)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +["AAPL", "MSFT", "NVDA", "TSLA", "CRM", "GOOG", "GOOGL", "V", "COST"] filter ($endsWith("A"))
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filter
 +(value, index) -> ((value.cik_str mod 2) == 1) and
 +(index > 5) and
 +(value.ticker startsWith  ("T"))
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +["AAPL", "MSFT", "NVDA", "TSLA", "CRM", "GOOG", "GOOGL", "V", "COST"] [?( $ contains "GO" )]
 +</code>
 +
 +
 +== Инфиксная запись / Infix Notation ==
 +
 +Когда вы пишете арифметическое выражение, такое как B * C, форма выражения предоставляет вам информацию, позволяющую правильно его интерпретировать. В этом случае мы знаем, что переменная B умножается на переменную C, поскольку между ними в выражении появляется оператор умножения *. Этот тип записи называется инфиксным , поскольку оператор находится между двумя операндами, над которыми он работает.
 +
 +До сих пор мы вызывали фильтр, используя префиксную запись. При использовании префиксной записи имя функции помещается перед аргументами. Если функция принимает два аргумента, как это делает фильтр, DataWeave позволяет вызывать ее с инфиксной записью.
 +
 +<note tip>Обратите внимание на дополнительные круглые скобки вокруг первой лямбды. Круглые скобки вокруг лямбда-выражений помогают DataWeave определить, где начинается и заканчивается лямбда-выражение.</note>
 +
 +<code>
 +%dw 2.0
 +output json
 +
 +var numbers = (1 to 5)
 +---
 +numbers filter ((n, idx) -> (n mod 2) == 1)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +
 +var numbers = (1 to 5)
 +---
 +numbers
 +  filter ((n, idx) -> (n mod 2) == 1)
 +  filter ((n, idx) -> (n > 3))
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +[ ] filter (value, index) -> (condition)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +[ ] filter (<condition using $, $$>
 +</code>
 +
 +== Prefix Notation  ==
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +filter([ ], (value, index) -> (condition))
 +</code>
 +=== filterObject ===
 +
 +Оператор  filterObject перебирает список пар ключ-значение в объекте и применяет выражение, которое возвращает только соответствующие объекты, отфильтровывая остальные из выходных данных. Выражение должно возвращать значение  true или  false. Если выражение возвращает  true ключ, значение или индекс объекта, объект фиксируется в выходных данных. Если он возвращает  false какой-либо из них, объект отфильтровывается из вывода. Если совпадений нет, выходной массив будет пустым.
 +
 +{{ :develop:f5f675_07446b0d77c8425e81b40ce33ebe0ec6_mv2.webp |}}
 +
 +Infix Notation: Long-Hand
 +<code>
 +{ } filterObject (value,  key, index) -> (condition)
 +</code>
 +
 +Infix Notation: $ syntax 
 +<code>
 +{ } filterObject (condition with $, $$ , $$$ syntax) 
 +</code>
 +
 +Prefix Notation 
 +<code>
 +filterObject({ }, (value, index) -> (condition))
 +</code>
 +
 +Filter Expression 
 +<code>
 +{ } [? (<boolean_expression>) ]
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload filterObject (value, key, index) -> key == "age"
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload filterObject (value, key, index) -> key~="age"
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var myObject = {
 +    str1 : "String 1",
 +    str2 : "String 2",
 +    str3 : null,
 +    str4 : "String 4",
 +}
 +---
 +myObject filterObject $ != null
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +(value, key, index) -> ((value.ticker contains "GO"))
 +</code>
 +
 +<code>
 +Filter object by key 
 +
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +(value, key, index) -> (((key as Number) mod 2) == 0)
 +</code>
 +
 +<code>
 +Filter object by index
 +
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +(value, key, index) -> (((index) mod 2) == 0)
 +</code>
 +
 +<code>
 +Filter object by value with $ syntax 
 +
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +$ is Object
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +$ is Array
 +</code>
 +
 +<code>
 +Filter object by key with $$ syntax 
 +
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +((($$ as Number) mod 2) == 0)
 +</code>
 +
 +<code>
 +Filter object by index with $$$ syntax 
 +
 +%dw 2.0
 +output application/json
 +---
 +payload
 +filterObject
 +(($$$ mod 2) == 0)
 +</code>
 +
 +<code>
 +Filter object using the filter expression selector
 +
 +%dw 2.0
 +output application/json
 +
 +---
 +payload [?( $.ticker contains "GO" )]
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json  
 +---
 +payload filterObject ((value, key) -> 
 +    (key as String != "first name"
 +    and (key as String != "last name")
 +)
 +</code>
 +=== flatten ===
 +
 +Для перемещения элементов из подмассивов в родительский массив, удаления подмассивов и преобразования всех пар ключ-значение в список объектов в родительском массиве. С помощью функции Flatten несколько массивов объединяются в один массив.
 +
 +  * **items** The input array of arrays made up of any supported types.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +flatten(payload)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var array1 = [1,2,3]
 +var array2 = [4,5,6]
 +var array3 = [7,8,9]
 +var arrayOfArrays = [array1, array2, array3]
 +---
 +flatten(arrayOfArrays)
 +</code>
 === groupBy === === groupBy ===
  
Строка 68: Строка 710:
 </code> </code>
  
 +=== map ===
 +
 +Функция карты используется для преобразования данных, содержащихся в массиве. Это делается путем перебора элементов массива и применения преобразования к каждому элементу. Результат преобразования собирается вместе и выводится в виде массива преобразованных элементов.
 +
 +Перебирает элементы массива и выводит результаты в новый массив.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{
 +    "candidatedetails": payload.employee map((item,index) -> {
 +        "fname":item.FirstName ++ " " ++ item.LastName
 +    })
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload map (n, idx) -> n + 1
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload.items.*name map (
 +    (item, index) -> {name: item}
 +)
 +</code>
 +
 +<code>
 +
 +%dw 2.0
 +var myVar = [
 +  { bookId: 101,
 +    title: "world history",
 +    price: "19.99"
 +  },
 +  {
 +    bookId: 202,
 +    title: 'the great outdoors',
 +    price: "15.99"
 +  }
 +]
 +var myVar2 = [
 +  {
 +    bookId: 101,
 +    author: "john doe"
 +  },
 +  {
 +    bookId: 202,
 +    author: "jane doe"
 +  }
 +]
 +output application/json
 +---
 +myVar map (item, index) -> using (id = item.bookId) {
 + "id" : id,
 + "topic" : item.title,
 + "cost" : item.price as Number,
 + (myVar2 filter ($.*bookId contains id) map (item) -> {
 + author : item.author
 + })
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/java
 +fun process(obj: Object) = obj mapObject ((value, key) -> {
 +    (key): key match {
 +        case "description" -> vars.descriptionValue
 +        else -> value
 +    }
 +})
 +---
 +payload map ((item, index) -> 
 +    process(item)
 +)
 +</code>
 +=== mapObject ===
 +
 +Функция  mapObject используется для преобразования данных, содержащихся в объекте. Это делается путем перебора каждой пары ключ/значение в объекте и применения преобразования к каждому ключу и значению. Он принимает объект и лямбду, которая принимает 3 параметра: значение, ключ и индекс, и возвращает новый объект. Наконец, вся функция возвращает объект.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{"a":"b","c":"d"} mapObject (value,key,index) -> { (index) : { (value):key} }
 +</code>
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload mapObject (value, key, index) -> {
 +  (upper(key)): value
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var user = {"firstName": "Manik", "lastName": "Magar", "addressLine1" : "Address line 1"}
 +var userList = [{"firstName": "Manik", "lastName": "Magar", "addressLine1" : "Address line 1"},
 + {"firstName": "Om", "lastName": "Magar", "addressLine1" : "Address line 2"}
 +]
 +---
 +{
 + mapObject: user mapObject (value:String, key:Key, index:Number) -> { 
 + '$key-$index': value
 + },
 +
 + pluck: user pluck (value, key, index) -> (key ++ '-' ++ index ++ '-' ++ value),    
 +
 + filter: user filterObject ((value, key, index) -> (index < 1)), 
 + filter2: userList filter ((value, index) -> (index < 1)), 
 +
 + groupBy1 : user groupBy (value, key) -> key endsWith 'Name',    
 + groupBy2 : userList groupBy ((value, index) -> value.lastName)   
 +
 +}
 +</code>
 +
 +=== pluck ===
 +
 +это функция, используемая для преобразования свойств и значений этих свойств объекта в массив свойств, массив значений и массив индексов этих свойств. Эту функцию можно использовать, если вам нужно преобразовать объект в массив.
 +
 +<code>
 +%dw 2.0
 +output json
 +---
 +payload pluck (v,k,idx) -> {(k): v}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var requestBody= 
 +{
 +    "name":"Jack",
 +    "name":"James",
 +    "name":"Joseph"
 +}
 +---
 +{
 +    value: requestBody pluck $,
 +    keys: requestBody pluck $$,
 +    indexes: requestBody pluck $$$
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var requestBody= 
 +{
 +    "car": 
 +    {
 +        "Make&Model": "Maruti Suzuki Swift",
 +        "MakeYear": 2017,
 +        "Color": "Red",
 +        "Type": "Hatchback",
 +    },
 +    "car": 
 +    {
 +        "Make&Model": "Maruti WagonR",
 +        "MakeYear": 2018,
 +        "Color": "Brown",
 +        "Type": "Hatchback",
 +    },
 +    "car": 
 +    {
 +        "Make&Model": "Honda City",
 +        "MakeYear": 2017,
 +        "Color": "Red",
 +        "Type": "Sedan",
 +    },
 +    "car": 
 +    {
 +        "Make&Model": "Ford Figo",
 +        "MakeYear": 2017,
 +        "Color": "Black",
 +        "Type": "Hatchback",
 +    }
 +}
 +---
 +car:requestBody pluck $ filter $.Color == "Red"
 +</code>
 === reduce === === reduce ===
  
Строка 114: Строка 948:
 </code> </code>
  
 +<code>
 +%dw 2.0
 +output application/json
  
 +var data = {"xyz": {"abc":["account":[{"value":"savings"}]]}}
 +---
 +data..value reduce $
 +</code>
 +
 +=== read ===
 +
 +  * **stringToParse** The string or binary to read.
 +  * **contentType** A supported format (or content type). Default: application/dw.
 +  * **readerProperties** Optional: Sets reader configuration properties. For other formats and reader configuration properties, see Supported Data Formats.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var inputData=
 +"name,age,salary
 +Joseph,34,3000
 +James,32,5000"
 +---
 +read(inputData,"application/csv")
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myVar = "Some, Body"
 +output application/json
 +---
 +read(myVar,"application/csv",{header:false})[0]
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/xml
 +---
 +read('{ "hello" : "world" }','application/json')
 +</code>
 +
 +=== readUrl ===
 +
 +  * **url** The URL string to read. It also accepts a classpath-based URL. for example: classpath:\/\/myfolder/myFile.txt where myFolder is located under src/main/resources in a Mule project. Other than the URL, readURL accepts the same arguments as read.
 +  * **contentType** A supported format (or MIME type). Default: application/dw.
 +  * **readerProperties** Optional: Sets reader configuration properties. For other formats and reader configuration properties, see Supported Data Formats.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +readUrl("classpath://employee.json","application/json")
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myJsonSnippet = readUrl("classpath://myJsonSnippet.json", "application/json")
 +output application/csv
 +---
 +(myJsonSnippet.results map(item) -> item.profile)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +readUrl("https://jsonplaceholder.typicode.com/users/5","application/json")
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +var inputData=readUrl("https://jsonplaceholder.typicode.com/users/5","application/json")
 +---
 +{
 +    name: inputData.name,
 +    username: inputData.username,
 +    email: inputData.email
 +}
 +</code>
 +=== splitBy ===
 +
 +Разбивает строку на массив строк на основе входного значения или соответствует части этой входной строки. Он отфильтровывает соответствующую часть из возвращаемого массива. Строка или регулярное выражение Java, используемое для разделения строки. Если какая-то часть строки не соответствует, функция вернет исходную неразбитую строку в массиве.
 +
 +Эта версия splitBy принимает регулярное выражение Java (регулярное выражение), соответствующее входной строке. Регулярное выражение может соответствовать любому символу во входной строке. Обратите внимание, что splitBy выполняет противоположную операцию joinBy.
 +
 +  * **text** The input string to split.
 +  * **regex** A Java regular expression used to split the string. If it does not match some part of the string, the function will return the original, unsplit string in the array.
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{ "splitters" : {
 +   "split1" : "a-b-c" splitBy(/^*.b./),
 +   "split2" : "hello world" splitBy(/\s/),
 +   "split3" : "no match" splitBy(/^s/),
 +   "split4" : "no match" splitBy(/^n../),
 +   "split5" : "a1b2c3d4A1B2C3D" splitBy(/^*[0-9A-Z]/)
 +  }
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +{ "splitters" : {
 +    "split1" : "a-b-c" splitBy("-"),
 +    "split2" : "hello world" splitBy(""),
 +    "split3" : "first,middle,last" splitBy(","),
 +    "split4" : "no split" splitBy("NO")
 +   }
 +}
 +</code>
 +
 +=== valuesOf ===
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +valuesOf(payload.responses) filter ($.fieldname ~= "verifyemail")
 +</code>
 +<code>
 +%dw 2.0
 +output application/java
 +---
 +payload splitBy(" ")
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/java
 +---
 +payload splitBy(/s/)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +"192.88.99.0/24" splitBy(/[.\/]/)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +"192.88.99.0" splitBy(".")
 +</code>
  
 ==== Working with Objects / dw::core::Objects ==== ==== Working with Objects / dw::core::Objects ====
Строка 127: Строка 1111:
   * **takeWhile** Selects key-value pairs from the object while the condition is met.   * **takeWhile** Selects key-value pairs from the object while the condition is met.
   * **valueSet** Returns an array of the values from key-value pairs in an object.   * **valueSet** Returns an array of the values from key-value pairs in an object.
 +
 +=== everyEntry ===
 +
 +<code>
 +%dw 2.0
 +import everyEntry from dw::core::Objects
 +output application/json
 +---
 +{
 +    a: {} everyEntry (value, key) -> value is String,
 +    b: {a: "", b: "123"} everyEntry (value, key) -> value is String,
 +    c: {a: "", b: 123} everyEntry (value, key) -> value is String,
 +    d: {a: "", b: 123} everyEntry (value, key) -> key as String == "a",
 +    e: {a: ""} everyEntry (value, key) -> key as String == "a",
 +    f: null everyEntry ((value, key) -> key as String == "a")
 +}
 +</code>
 +
 +=== mergeWith ===
 +
 +<code>
 +%dw 2.0
 +import mergeWith from dw::core::Objects
 +output application/json
 +---
 +{ "a" : true, "b" : 1} mergeWith { "a" : false, "c" : "Test"
 +</code>
 +
 +=== someEntry ===
 +
 +<code>
 +%dw 2.0
 +import someEntry from dw::core::Objects
 +output application/json
 +---
 +{
 +    a: {} someEntry (value, key) -> value is String,
 +    b: {a: "", b: "123"} someEntry (value, key) -> value is String,
 +    c: {a: "", b: 123} someEntry (value, key) -> value is String,
 +    d: {a: "", b: 123} someEntry (value, key) -> key as String == "a",
 +    e: {a: ""} someEntry (value, key) -> key as String == "b",
 +    f: null someEntry (value, key) -> key as String == "a"
 +}
 +</code>
 +==== dw::util::Values ====
 +
 +=== Selector Expressions (update Operator) ===
 +
 +update оператор позволяет обновлять указанные поля структуры данных новыми значениями.
 +Этот селектор соответствия может проверять совпадения с любым значением внутри объекта.
 +
 +<code>
 +%dw 2.0
 +var myInput = {
 +    "name": "Ken",
 +    "lastName":"Shokida",
 +    "age": 30,
 +    "address": {
 +        "street": "Amenabar",
 +        "zipCode": "AB1234"
 +    }
 +}
 +output application/json
 +---
 +myInput update {
 +    case age at .age -> age + 1
 +    case s at .address.street -> "First Street"
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload update {
 +    case s at .addresses[0] -> {
 +        "street": "Second Street",
 +        "zipCode": "ZZ123"
 +    }
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload update {
 +    case name at .user.@name -> upper(name)
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +var theFieldName = "name"
 +output application/json
 +---
 +payload update {
 +    case s at ."$(theFieldName)" -> "Shoki"
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload map ((user) ->
 +    user update {
 +        case name at .name if(name == "Ken") -> name ++ " (Leandro)"
 +        case name at .name if(name == "Tomo") -> name ++ " (Christian)"
 +    }
 +)
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myInput = [{"lastName": "Doe"}, {"lastName": "Parker", "name": "Peter" }]
 +output application/json
 +---
 +myInput  map ((value) ->
 +    value update {
 +        case name at .name! -> if(name == null) "JOHN" else upper(name)
 +    }
 +)
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload update {
 +    //equivalent expression:
 +    //case age at .age -> age + 1
 +    case .age -> $ + 1
 +    case .address.street -> "First Street"
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myInput = {
 +    "name": "Ken",
 +    "lastName":"Shokida",
 +    "age": 30
 +}
 +output application/json
 +---
 +myInput mapObject ((value,key) ->
 +    if(key as String == "age")
 +       {(key): value as Number + 1}
 +    else
 +       {(key): value} )
 +</code>
 +
 +<code>
 +%dw 2.0
 +var myInput = {
 +    "name": "Ken",
 +    "lastName":"Shokida",
 +    "age": 30
 +}
 +output application/json
 +---
 +myInput update {
 +    case age at .age -> age + 1
 +}
 +</code>
 +
 +<code>
 +%dw 2.0
 +output application/json
 +---
 +payload map ((item) ->
 +    item.ServiceDetails update {
 +        case Designation at .Designation if (Designation == "Clerk") ->  "Assistant Manager"
 +})
 +</code>
  
 ====== Ссылки ====== ====== Ссылки ======
  
   * https://docs.mulesoft.com/dataweave/latest/   * https://docs.mulesoft.com/dataweave/latest/
 +  * https://mulesy.com/1-mulesoft-as-middleware-solution/
 +  * https://reddeveloper.ru/tags/mule
 +  * https://questu.ru/tag/mule/