0

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

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

我曾经StructIsEmpty检查过我的结构。问题是,当我的结构元素只包含空字符串时,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> 
4

2 回答 2

1

就像 Dan 说的,这个结构不是空的。如果你想检查你的结构是否有空白的值,你可以做这样的事情。并检查您的structFieldsAreEmpty变量是否为真,如果是,则您的结构具有所有空白值。如果您的结构返回多个条目,则需要修改此代码

<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>
于 2013-10-22T17:47:59.330 回答
0

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

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

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

于 2013-10-23T00:44:18.100 回答