在ColdFusion 8中是否有类似于ColdFusion 9的ArrayFind函数的功能?

4

我在工作中与另一位程序员交谈,我们使用ColdFusion。他告诉我,如果要在数组中查找一个值,我必须进行整个循环?难道ColdFusion 8中没有简单查找数组值的函数吗?


意译:如果有人从搜索中跌入这里,请注意问题是关于CF8的,我们现在已经实现了https://cfdocs.org/arrayfind :)翻译后:如果有人因搜索而来到这里并且涉及CF8的问题,我们现在已经实现了https://cfdocs.org/arrayfind :) - jinglesthula
3个回答

12

arrayFind()在ColdFusion 8中不存在。但是,您不需要循环。有两种方法:

利用ColdFusion数组实现java.util.List接口的事实:

<cfset valueToFind = 1>
<cfset array = [1,2,3]>
<!--- add one because CF does 1 based vs. Java 0 based arrays --->
<cfset position = array.indexOf(valueToFind) + 1> 
使用列表操作:
<cfset valueToFind = 1>
<cfset array = [1,2,3]>
<cfset position = listFind(arrayToList(array), valueToFind)>

第一个(Java List)方法更快。


是的,下面提到的两种方法是相同的。(第三种方法显然是通过数组循环)。顺便说一句:值得注意的是,Java方法没有记录,并且可能会表现出与您预期不同的行为。因此,请自行承担使用风险。 - Leigh
@Leigh:Java方法的意外行为是什么? - orangepips
@orangepips:如果他知道的话,那就不会是意外了 :) 我认为他的观点是,如果没有文档记录,那么关于它的任何内容都可能在下一个CF更新/版本中发生变化。或者它甚至可能完全消失。那将是非常意外的,不是吗? :) - charliegriefer
@orangepips: true。但Adobe并没有明确记录其基本方法。我不是说如果可用就不应该使用它们,但需要注意这个警告(在我看来)。 - charliegriefer
1
@orangepips - Java方法匹配对象类型和值。因此,对值/类型1(整数)的搜索与1(字符串)不同。因此,如果您不确切知道正在处理哪些对象类型,则结果可能会让您感到惊讶。Java方法也区分大小写。但前者是最大的陷阱。 - Leigh
显示剩余3条评论

4
据我所知,在CF8中没有记录文档的arrayFind函数。有一个arrayFind function at cflib.org,它利用了一些未记录的java功能。另请参见How do I find a value in an array?

......ColdFusion数组是Java列表(java.util.List)的实现。因此,所有Java列表方法都适用于CF数组。

所以要搜索数组,你只需要添加适当的方法。例如,给定这个数组:

<cfset arry = listToArray("tom, dick, harry, phred")>

你可以像这样查找:<cfset findValue = arry.indexOf("harry")>

将返回2 - harry在数组中的索引值。

indexOf返回项目在数组中的索引值。

NB:请注意,与CF方法不同,Java方法匹配值和类型。因此,搜索数字1(整数/双精度等)与搜索“1”(字符串)不同。如果您不知道确切的对象类型,结果可能会让您感到惊讶。

看这两个例子:

<cfscript>
// numeric searches are sensitive to type
arry = listToArray("2,4,6");
writeOutput('<br>indexOf("6") =  '&  arry.indexOf("6"));
writeOutput('<br>indexOf( val(6) )=  '&  arry.indexOf(val(6)));

// string searches are case sensitive
arry = listToArray("tom,dick,harry,phred");
writeOutput("<br>indexOf(harry) =  "&  arry.indexOf("harry"));
writeOutput("<br>indexOf(HaRry) = "&  arry.indexOf("HaRry"));
</cfscript>

搜索"6"得到的结果与val(6)不同。

  • indexOf("6") = 2
  • indexOf(val(6)) = -1

...而对于"harry"的字符串搜索,与"HaRry"得到的结果也不同。

  • indexOf(harry) = 2
  • indexOf(HaRry) = -1

因此,在使用Java方法时,请了解您正在获得什么...以及您没有获得什么。


1
很不幸,您提到的两个链接已经无法访问。因此,这个回答对未来的用户没有任何帮助。:( 只是想提醒您。谢谢。 - Anil
1
已完成。已使用web.archive.org的副本替换了损坏的链接,并添加了来自链接文章的内容片段。感谢@AnilNatha提供的提示。 - Leigh
随时!感谢您更新帖子。 - Anil

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接