仅当条件为真时更改数组元素中 json 的字段

Change field of json in element of array only if condition is true

全部。 我正在尝试更改 json 中数组元素中字段的值,条件是:如果 "field1" 的值等于 "value1",则将字段 "changethisfield" 的值更改为 "new_value"。 当前负载:

    {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

数据编织代码:

    %dw 2.0
    output application/json

    var itemValue = payload.message map (item) -> {
        (item mapObject (value, key, index) -> {
            ((key): value) if (key as String != 'changethisfield'),
            (changethisfield: "new_value") if (key as String == 'changethisfield')
        })
    }

    ---

    {
        "message": {
            item: itemValue
        }
    }

但是这段代码改变了数组所有元素的值(当前输出):

{
  "message": {
    "item": [
      {
        "field1": "value1",
        "field2": "value2",
        "changethisfield": "new_value"
      },
      {
        "field1": "value3",
        "field2": "value4",
        "changethisfield": "new_value"
      }
    ]
  }
}

期望的输出(只有 "field1" 包含 "value1" 的 "changethisfield" 项的值应更改为 "new_value"):

{
  "message": {
    "item": [
      {
        "field1": "value1",
        "field2": "value2",
        "changethisfield": "new_value"
      },
      {
        "field1": "value3",
        "field2": "value4",
        "changethisfield": ""
      }
    ]
  }
}

请帮助理解我如何在数组元素中设置条件并解决此任务。谢谢!

这应该有效:

%dw 2.0
output application/dw

var data =     {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

---
message: data.message map {
    ($ - "changethisfield"),
    changethisfield: if ($.field1 == "value1") "new_value" else $.changethisfield
}

想补充一点,您也可以使用 update 函数,而不是手动删除重新添加字段到对象。这也可以将数组中的每个项目更改为特定值,但由于您有条件,因此必须在地图内执行它。

您的比较的问题是您在对象级别进行了比较,并且仅当键是特定字符串时才进行比较。您没有检查 field1 是否具有特定值。

%dw 2.0
output application/json
import * from dw::util::Values

var inputData =     {
      "message": [
        {
          "field1": "value1",
          "field2": "value2",
          "changethisfield": ""
        },
        {
          "field1": "value3",
          "field2": "value4",
          "changethisfield": ""
        }
      ]
    }

---
{
    message: inputData.message map ((item, index) -> (
        if (item.field1 == "value1") (
            item update "changethisfield" with "newValue"
        ) else (
            item
        )
    ))
}