2012-12-17 28 views
1

顯示結構信息,我想顯示一個結構關鍵的像值:ColdFusion的

#stReviewDetail['tags']['travelParty']['value']# 

這可能是tagstravelPartyvalue丟失。檢查結構層次結構是否可用的最佳方法是什麼?喜歡的東西:

<cfif StructKeyExists(stReviewDetail, 'tags') AND 
     StructKeyExists(stReviewDetail['tags'], 'travelParty') AND 
     StructKeyExists(stReviewDetail['tags']['travelParty'], 'value') > 
    .... 
</cfif> 

還是有更好的方式來做到這一點?

+0

通過使用StructKeyExists,您正處於正確的軌道上。然而,真正的答案取決於你想顯示的內容,如果有一些,但不是所有的鍵都存在。如果你不知道,Stackoverflow上的人是錯誤的。 –

+1

這也正是方法我會拿得,與多StructKeyExists – duncan

+1

正如@DanBracuk說,這取決於你想要什麼。如果你只能知道它是否有效,你可以嘗試從try-catch塊中引用它。如果它有效,冷卻,否則,在捕獲物中做一些明智的事情。 – Barry

回答

5

多StructKeyExists是醜陋的,它很容易編寫一個函數來簡化這個:

用法:

<cfif CheckNestedKeys(stReviewDetail,['tags','travelParty','value']) > 
    #stReviewDetail['tags']['travelParty']['value']# 
</cfif> 


代碼:

<cffunction name="CheckNestedKeys" returntype="Boolean" output=false> 
    <cfargument name="Struct" type="Struct" required /> 
    <cfargument name="Keys" type="Array" required /> 

    <cfset var CurStruct = Arguments.Struct /> 

    <cfloop index="local.CurKey" array=#Arguments.Keys# > 
     <cfif StructKeyExists(CurStruct,CurKey)> 
      <cfset CurStruct = CurStruct[CurKey] /> 
     <cfelse> 
      <cfreturn false /> 
     </cfif> 
    </cfloop> 

    <cfreturn true /> 

</cffunction> 
+0

這不應該爲每個測試返回不同的東西嗎?也許是存在的最後一把鑰匙? – Travis

+0

大多數時候我不在乎 - 它只是一個安全檢查 - 但它很容易修改它返回CurKey或空字符串,如果這就是你想要的。 –

+0

哦,大概值得一提的是,在Railo 4.1中,我認爲你可以這樣做: \t'#stReviewDetail ['tags'] ['travelParty'] ['value']?:'如果未定義輸出' #' –

2

如果您知道具體的鍵,你可以使用isDefined

<cfif isDefined("stReviewDetail.tags.travelParty.value")> 
    <cfdump var="#stReviewDetail.tags#">  
</cfif> 
+0

isDefined在邏輯上等同於StructKeyExists,但速度較慢。 –

+2

有點......它會給你答案,但它不太準確。如果你有變量。變量,並且使用isDefined(「someVar」),認爲你正在尋找form.someVar,你就會變成真實的。 structKeyExists更準確,因爲你必須定義你的結構/範圍。就速度而言,我看到的最後一次測試可以忽略不計,但只是在錯誤的情況下才會變慢。 – Travis

+2

這也應該是'isDefined(「stReviewDetail.tags.travelParty.value」)'我試圖編輯它,但更改被拒絕。 – Travis