2011-05-27 57 views
0

为什么arrayFindNoCase()返回false?它不应该返回2吗?ArrayFind()在返回索引值时返回false!

local.data = 
[ 
    { 
     name = "foo", 
     value = 5 
    }, 
    { 
     name = "bar", 
     value = 6 
    } 
]; 

local.key = arrayFindNoCase(data, { value = 6 }); 
+0

我只希望搜索整个元素2,即'{name =“bar”,value = 6}'。 – Leigh 2011-05-27 19:26:16

+0

@Leigh,我不知道是这样。如果我只是在寻找部分匹配,我有什么选择吗? – Mohamad 2011-05-27 19:31:05

+0

@Leigh,这就是我最终做的。事情是,该功能已经在一个循环内。所以我不得不做一个有点复杂的嵌套循环。我明白了。谢谢。 – Mohamad 2011-05-27 20:43:57

回答

2

不是真的,因为{值= 6}!= {名称= “酒吧”,值= 6}

+0

如果绝对有必要只使用部分匹配,我的选择是什么? – Mohamad 2011-05-27 19:27:53

+0

做它的老式的方式?即循环并检查每个元素。 – Leigh 2011-05-27 19:31:28

+0

尝试ArrayContains http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WS2EF4F7C2-F41D-42fe-940D-B7C0212FF3D9.html – 2011-05-28 14:07:26

1

你不能做部分匹配...如果你已经搜查如下,你已经得到了2

local.key = arrayFindNoCase(local.data, {name = "bar",value = 6 } 
1

它返回false,因为你正在寻找:

{ value = 6 } 

这不是数组的元素。该阵列有:

{ name = "bar", value = 6 } 
1

答案已经在这里 - 正如你发现你不能通过标准CF函数搜索数组中的结构。

这里的,如果你想要的特定功能的滚动自己的一个简单的例子。

<cffunction name="arrayFindStructKey" returntype="numeric"> 
    <cfargument name="arr" type="array" required="true"> 
    <cfargument name="key" type="string" required="true"> 
    <cfargument name="val" type="string" required="true"> 

    <cfset var i = 0> 

    <cfloop from="1" to="#arrayLen(arguments.arr)#" index="i"> 
     <cfif isStruct(arguments.arr[i]) and structKeyExists(arguments.arr[i], arguments.key)> 
       <cfif arguments.arr[i][arguments.key] eq arguments.val> 
        <cfreturn i> 
       </cfif> 
     </cfif> 
    <\cfloop> 

    <cfreturn 0> <!--- not found ---> 

</cffunction>