ColdFusion StructIsEmpty在空字符串上返回NO

时间:2013-10-22 17:22:05

标签: coldfusion

我正在将结构传递给req的函数。字段验证,但我首先检查我的结构是否为空。

如果我结构中的所有元素都是空的(emptry string),我不会将此结构传递给验证。

我用StructIsEmpty来检查我的结构。问题是,当我的Structure的元素只包含空字符串时,StructIsEmpty返回NO。不幸的是我还在 CF8

当所有结构元素只有空字符串时,如何让StructIsEmpty返回YES

    <cfset st_MyStruct=StructNew()>
    <cfset st_MyStruct["InstType"]="#Trim(arr[112])#">
    <cfset st_MyStruct["InstId"]="#Trim(arr[113])#">
    <cfset st_MyStruct["PLN"]="#Trim(arr[115])#">
    <cfset st_MyStruct["PFN"]="#Trim(arr[116])#">
    <cfset st_MyStruct["Referal"]="#Trim(arr[118])#">

    cfif StructIsEmpty(st_MyStruct) NEQ "NO">
      <CFINVOKE component="cfcomponents.ValidateFields" method="CheckReqFields"
                                                        st_MyStruct="#st_MyStruct#"
                                                        Inst="#arguments.Inst#" >    

    </cfif> 

2 个答案:

答案 0 :(得分:1)

像丹说的那样,这个结构不是空的。如果要检查结构是否具有空白值,可以执行以下操作。并检查您的structFieldsAreEmpty变量是否为真,如果确实如此,那么您的结构是否包含所有空值。如果您的struct返回多个条目,则需要修改此代码

<cfset st_MyStruct = {}>
<cfset st_MyStruct["InstType"] = ''>
<cfset st_MyStruct["InstId"] = ''>
<cfset st_MyStruct["PLN"] = ''>
<cfset st_MyStruct["PFN"] = ''>
<cfset st_MyStruct["Referal"] = ''>

<cfset structFieldsAreEmpty = checkStructValuesEmpty(st_MyStruct) />

<cffunction name="checkStructValuesEmpty" access="private" returntype="boolean" output="false">
    <cfargument name="myStruct" type="struct" required="true">
    <cfloop collection="#arguments.myStruct#" index="i">
        <cfif len(trim(arguments.myStruct[i]))>
            <cfreturn false>
        </cfif>
    </cfloop>
    <cfreturn true>
</cffunction>

答案 1 :(得分:0)

如果你想在一行中执行此操作,可以将结构序列化为JSON,并使用正则表达式搜索任何非空字符串值,如下所示:

structIsEmptyStrings = refind(':("[^"]+"|\d+|true|false)', serializeJSON(st_MyStruct)) == 0;

正则表达式正在寻找任何非空字符串(""),数字或布尔值(truefalse)的值。请记住,如果struct中的任何值都是string,numeric或boolean之外的任何类型(不检查嵌套数组或结构),则这将不准确。此外,如果任何字符串值只是空格,则会认为该结构不为空(可能不是您要查找的内容)。