Как использовать фильтр на карте

#filter #dataweave

#Фильтр #сохранение данных

Вопрос:

У меня есть следующий код:

 %dw 2.0 output application/json var attributeIdMapping =
 ${vault::attributeIdMapping}
--- {
     "objectTypeId": 3,
     "attributes": vars.requestBody mapObject (value, key) ->
        {
            "objectTypeAttributeId": (attributeIdMapping.attributes filter ($.name == key))[0].id,
            "objectAttributeValues": [{
             "value": value,
             "key": key
         }] 
        } }
  

attributeIdMapping:

 {
    "attributes": [
        {
            "name": "accountType",
            "id": "87"
        },
        {
            "name": "accountClass",
            "id": "89"
        },
        {
            "name": "accountName",
            "id": "85"
        },
        {
            "name": "displayName",
            "id": "18"
        },
        {
            "name": "accountCategory",
            "id": "88"
        },
        {
            "name": "accountNumber",
            "id": "84"
        },
        {
            "name": "description",
            "id": "86"
        },
        {
            "name": "accountGroup",
            "id": "90"
        }
    ]
}
  

vars.RequestBody:

 {
    "displayName": "TestMulesoft2",
    "description": "Test"
}
  

Но мой фильтр показывает null в конце. Как я понимаю, ключ не передается на уровень ниже самой карты. Как я могу заставить это работать?

Комментарии:

1. Вы должны четко понимать свои входные данные и использование. Что содержит vars.RequestBody ? что содержит attributeIdMapping.attributes ? Почему вы фильтруете $.name с помощью ключа, известного как идентификаторы индексов?

2. Здравствуйте. Обновлен исходный пост со значениями переменных. В качестве дополнительного комментария код работает так, как должен, если я, например, изменю ключ фильтра на «описание».

3. Каков ожидаемый результат, если он сработал?

Ответ №1:

Я помещаю все входные данные внутрь скрипта, чтобы упростить воспроизведение. Проблема, по-видимому, заключается в использовании оператора == для сравнения строки, а типы ключей возвращают значение empty. Использование оператора ~= , который пытается принудить, возвращает ожидаемый результат:

 %dw 2.0 
output application/json 
var attributeIdMapping =
{
    "attributes": [
        {
            "name": "accountType",
            "id": "87"
        },
        {
            "name": "accountClass",
            "id": "89"
        },
        {
            "name": "accountName",
            "id": "85"
        },
        {
            "name": "displayName",
            "id": "18"
        },
        {
            "name": "accountCategory",
            "id": "88"
        },
        {
            "name": "accountNumber",
            "id": "84"
        },
        {
            "name": "description",
            "id": "86"
        },
        {
            "name": "accountGroup",
            "id": "90"
        }
    ]
}
var requestBody = {
    "displayName": "TestMulesoft2",
    "description": "Test"
}
--- {
     "objectTypeId": 3,
     "attributes": requestBody mapObject (value, key) ->
        {
            "objectTypeAttributeId": (attributeIdMapping.attributes filter ($.name ~= key))[0].id,
            "objectAttributeValues": [{
             "value": value,
             "key": key
         }] 
        } }
  

Вывод:

 {
  "objectTypeId": 3,
  "attributes": {
    "objectTypeAttributeId": "18",
    "objectAttributeValues": [
      {
        "value": "TestMulesoft2",
        "key": "displayName"
      }
    ],
    "objectTypeAttributeId": "86",
    "objectAttributeValues": [
      {
        "value": "Test",
        "key": "description"
      }
    ]
  }
}
  

Комментарии:

1. Еще один вопрос. Есть ли простой способ получить все сопоставленные значения для объекта? Так что это было бы похоже: { "objectTypeId": 3, "attributes": [{ "objectTypeAttributeId": 18, "objectAttributeValues": [{ "value": "TestMulesoft" }] }, { "objectTypeAttributeId": 86, "objectAttributeValues": [{ "value": "TestMulesoft" }] }] }

2. Решил это, используя pluck вместо MapObject.