2017-08-21 24 views
4

假設您有分層數據並想要獲得單獨屬性的合併值,那麼最優雅的方法還是?最優雅的同時獲取兩個屬性的方法

以下示例包含有關失敗和跳過測試的信息。當然,它的確是有道理的,這些值是分開的 - 但對於檢索所有測試列表的用例來說,這些列表沒有成功運行,我遇到了兩種可能的解決方案,但他們都不滿足我。

def junitResultList = [ 
    [ 
     name: "Testsuite A", 
     children: [ 
      failedTests: ["Test 1", "Test 2"], 
      skippedTests: [] 
     ] 
    ], 
    [ 
     name: "Testsuite B", 
     children: [ 
      failedTests: ["CursorTest"], 
      skippedTests: ["ClickTest", "DragNDropTest"] 
     ] 
    ] 
] 

更具體地說,我想要的值是["Test 1", "Test 2", "CursorTest", "ClickTest", "DragNDropTest"]

第一種方法是簡單地執行加法蔓延測試列表:雖然這個工程

(junitResultList*.children*.failedTests + 
junitResultList*.children*.skippedTests).flatten() 

,它似乎我指定給這些屬性的路徑似乎兩次不是最常規的方法,所以我想出了這個可怕的,但不知何故吸引disasterpiece:

(junitResultList*.children*.findAll { 
    ['skippedTests', 'failedTests'].contains(it.key) 
})*.values().flatten() 

回答

2

您可以簡化您最初的表達是這樣的:

junitResultList.children.collect { it.failedTests + it.skippedTests }.flatten() 

junitResultList.children.collect { [it.failedTests, it.skippedTests] }.flatten() 
+0

這一行內容非常可讀,清楚地表明瞭它的意圖。 – Jazzschmidt

3

你可以做如下:

//Define the keys to find 
def requiredKeys = ['failedTests', 'skippedTests'] 
println requiredKeys.collect{ junitResultList.children."$it"}.flatten() 

您可以快速地嘗試相同的在線demo

+2

這真的很聰明! – Jazzschmidt

+0

@Jazzschmidt,如果答案是有幫助的話,如果你能接受答案並贊成票,那麼很感謝。 – Rao

+0

做了一個贊成,但希望看到更多的可能性。謝謝! – Jazzschmidt

2

你可以得到subMap() S和那麼values()就是:

junitResultList*.children*.subMap(["failedTests","skippedTests"])*.values().flatten() 
相關問題