【问题标题】:Groovy: replace all values in list with modified valueGroovy:用修改后的值替换列表中的所有值
【发布时间】:2016-09-12 19:26:41
【问题描述】:

我有一个包含值列表的地图。我需要用该值的编码/加密版本更新所述列表中的每个值。

地图和列表可以嵌套在任何地方,我只是给出了要更改的路径。例如myMap.myList.*myObject

我的列表图如下所示:

 mymap {"myList" : [{myObject : "aaa" }, {myObject : "bbb"}]}

我得到了这条路径:'myList*myObj'

尝试更新值的代码:

     myMap = [myList : [[myObject : "aaa"], [myObject : "bbb"]]];
     path = 'myList*.myObject';
     result = Eval.x(myMap, 'x.' + path + '="somenewvalue"');

这有效并用'somenewvalue'替换所有值但是我需要用加密版本的'aaa'替换每个值,用加密版本的'aaa'和'bbb'的加密版本'bbb' 等等。

但这会将所有值设置为相同的值。如何将值设置为不同的值?

【问题讨论】:

  • 你能放一个实际的示例输入映射和你尝试过的代码,而不是伪代码吗?
  • 更新为包含示例。

标签: groovy


【解决方案1】:
    def myMap = ["myList" : [[myObject : "aaa" ], [myObject : "bbb"]]]
    def theList = myMap["myList"].collect { [myObject: it.myObject.toUpperCase()]}
    myMap["myList"] = theList

println myMap

这可以创建一个全大写的版本 - 所以如果你有 encrypt(blah) 函数,你可以这样做:

    def myMap = ["myList" : [[myObject : "aaa" ], [myObject : "bbb"]]]
    def theList = myMap["myList"].collect { [myObject: encrypt(it.myObject)]}
    myMap["myList"] = theList

我确定它可以清理干净

【讨论】:

  • 嗯第二行可能会改为 myMap["myList"] = rest of line 并减少到一行
  • 我相信路径是可变的;目前还不清楚这个问题是具体的还是笼统的。 “地图和列表可以嵌套在任何地方,我只是得到了改变的路径”
  • 如果他知道路径就很容易了。可以调整的任何内容 - myMap["${pathToList}"] = myMap["${pathToList}"].collect { ["${objectName}" : encrypt(it."${objectName}")]} - 或一些这样的变化
  • 谢谢你,但正如迈克尔所说,我只是得到了一条路径,所以我将如何确定列表的深度来确定在哪里添加“收集”等。
  • 你能举个路径的例子吗?如果是我 - 我会使用路径来获取列表 - 就像在答案中一样 - 进行更改 t,然后使用路径替换原始位置的列表。
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 2022-10-14
  • 2022-12-21
  • 2021-06-19
  • 2015-07-22
  • 2022-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多