代码之家  ›  专栏  ›  技术社区  ›  Joshua Carmody

ColdFusion-搜索结构数组的有效方法是什么?

  •  12
  • Joshua Carmody  · 技术社区  · 17 年前

    我在ColdFusion中有一个半大型(数百条记录)一维数组。数组中的每个项都是一个具有多个属性的结构。我想在数组中搜索具有特定“name”属性的结构。我知道,对于字符串值数组,我可以使用如下Java方法:

    <cfset arrayIndex = myArray.indexOf("WhatImLookingFor") + 1>
    

    …但这对结构数组不起作用。我也知道我可以这样粗暴地对待它:

    <cfset arrayIndex = 0>
    <cfloop from="1" to="#ArrayLen(myArray)#" index="counter">
        <cfif myArray[counter].name IS "WhatImLookingFor">
            <cfset arrayIndex = counter>
        </cfif>
    </cfloop>
    

    …但我觉得必须有更有效的方法。有人有比这更好的解决方案吗?您可以假设“name”属性存在于每个结构中,并且数组中没有间隙或其他对象。

    5 回复  |  直到 14 年前
        1
  •  11
  •   Soldarnal    17 年前

    除非您在构建数组时创建了一个哈希表,否则我不知道如何创建一个比您发布的O(n)解决方案更快的搜索函数。无论如何,在构建阵列时,可以执行以下操作:

    <cfloop query="qryValues">
        <cfset nameValues[name] = currentrow />
        <cfset myArray[currentrow].name = name />
    </cfloop>
    
    <cfset arrayIndex = nameValues["WhatImLookingFor"] />
    

    这假定该值始终存在。在进行调用之前,您可能需要检查StructKeyExists(nameValues,“WhatimLooking”)。

        2
  •  8
  •   Russ    14 年前

    在CF 10或Railo 4中,您可以使用:

    arrayIndex = ArrayFind(arrayOfStructs, function(struct){ 
       return struct.name == "WhatImLookingFor"; 
    });
    

    它没有文档记录,但它是有效的!如果需要所有索引,ArrayFindAll()也是一个选项。

        3
  •  1
  •   Jas Panesar    17 年前

    如果不看得太深,我会考虑将结构转换为查询(以下),然后对查询进行查询。假设你的数据集不是太大!

    http://www.bennadel.com/blog/264-Ask-Ben-Converting-A-Struct-To-A-Query-And-More-Java-.htm

    一定要分享你最后做的事情!

    编辑:StructFindValue建议看起来也很好,我不认为需要查找任何相关函数。

        5
  •  0
  •   Henry    17 年前

    CFGroovy

    <cfset count = 0>
    <g:script>
    count = myArray.find({ 
      it["NAME"] == "WhatImLookingFor" }
    })
    </g:script>
    

    或如果您喜欢更java风格(不带闭包)

    <cfset count = 0>
    <g:script>
    for (i in myArray) {
      if( i["NAME"] == "WhatImLookingFor" )
        count++
    }
    </g:script>