2014-09-01 62 views
0

名單我有以下代碼:獲取包含在地圖

def bindingMap = [title: 'The Lamb Lies Down On Broadway', 
        'players[0]': [name: 'Steve Hackett'], 
        'players[1]': [name: 'Peter Gabriel'], 
        'players[2]': [name: 'Tony Banks']] 

我想從上面的圖中的「數組」的玩家。 因此,像線下將工作:

def players = bindingMap.players 
assert players == [[name: 'Steve Hackett'], [name: 'Peter Gabriel'], [name: 'Tony Banks']] 

感謝您的幫助

+0

示例代碼看起來像我可能在Grails用戶指南中寫的。如果您正在處理的地圖是Grails應用程序中的請求參數Map,則您有多個選項。是這樣嗎? – 2014-09-01 15:05:33

+0

@JeffScottBrown是的,我從Grails的文檔中獲得了這個。我有一個正在構建的對象表,並且我嘗試在控制器的動作中使用列表 theListName作爲參數接收它們,但似乎不起作用。 – john 2014-09-01 16:53:39

+0

「我試圖在控制器的動作中使用列表 theListName作爲參數接收它們,但似乎不起作用。」 - 請參閱http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding下的「數據綁定和操作參數」小節。它描述了控制器動作參數的特殊綁定的1​​7種支持類型,列表不是其中之一。支持特殊綁定的1​​7種類型是8個原語,8種類型的包裝對應物和'java.lang.String'。 – 2014-09-01 18:58:50

回答

3

在這個特殊的地圖結構,你可以findAll項,它的鍵與players開始,然後收集這些條目的value

def bindingMap = [title: 'The Lamb Lies Down On Broadway', 
        'players[0]': [name: 'Steve Hackett'], 
        'players[1]': [name: 'Peter Gabriel'], 
        'players[2]': [name: 'Tony Banks']] 

def players = bindingMap 
    .findAll { key, value -> key.startsWith("players") }*.value 
assert players == [ 
    [name: 'Steve Hackett'], [name: 'Peter Gabriel'], [name: 'Tony Banks']] 
1

原始問題並不表示這是關於Grails中的參數綁定,而是問題後面的註釋。因爲這就是你正在做的事情,所以你可以不必自己編寫任何參數解析代碼。

// grails-app/controllers/demo/DemoController.groovy 
package demo 

class DemoController { 

    def index(MyCommand command) { 

     // command.people will be populated if the request 
     // includes parameters like... 
     // people[0].name=Jeff 
     // people[0].town='St. Louis' 
     // people[1].name='Matt' 
     // people[1].town='San Jose' 

     // ... 
    } 
} 

class MyCommand { 
    List<People> people 
} 

class People { 
    String name 
    String town 
} 

這有許多的寫上自己的參數解析代碼的好處。

+0

請注意,根據您在做什麼,您可能會完全跳過命令對象。這個問題並沒有包括你想要完成的事情的詳細信息,以確定它在這裏是否有意義。通常這是在創建或更新域對象的情況下完成的,對於這些可以變得更簡單。 – 2014-09-01 18:55:39