ArrayFind () возвращает false, когда должен возвращать значение индекса! - PullRequest
0 голосов
/ 27 мая 2011

Почему arrayFindNoCase () возвращает false?Разве это не должно возвращать 2?

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

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

Ответы [ 4 ]

2 голосов
/ 27 мая 2011

Не совсем, так как {value = 6}! = {Name = "bar", value = 6}

1 голос
/ 15 июля 2011

Ответ уже здесь - поскольку вы обнаружили, что вы не можете искать структуру в массиве с помощью стандартных функций 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>
1 голос
/ 27 мая 2011

Возвращается ложь, потому что вы ищете:

{ value = 6 }

, который не является элементом массива. Массив имеет:

{ name = "bar", value = 6 }
1 голос
/ 27 мая 2011

Вы не можете выполнять частичные совпадения ... Если вы искали, как показано ниже, вы получите 2.

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