【问题标题】:Join Two Arrays in ColdFusion在 ColdFusion 中加入两个数组
【发布时间】:2011-03-06 03:16:03
【问题描述】:

ColdFusion 中是否有内置方法可以连接两个数组,类似于 JavaScript 的array.concat()

【问题讨论】:

    标签: arrays coldfusion cfml


    【解决方案1】:

    不是真的,但你猜怎么着,只使用 Java! :)

    <cfset foo = [1,2,3]>
    <cfset bar = [4,5,6]>
    <cfset foo.addAll( bar )>
    

    参考:Java's Collection Interface API.

    来源:http://www.aliaspooryorik.com/blog/index.cfm/e/posts.details/post/merging-two-arrays-267

    【讨论】:

    • 奇怪的是,底层 Java 方法并不总是按预期工作。我还没有弄清楚确切的时间和原因。我经常使用Java方法来删除重复,加入和排序数组,我记得有时它不起作用取决于你如何创建数组,你在调用Java方法之前执行了哪些操作等等。所以要注意!
    • @zarko.susnjar - 我知道这是一个旧线程,但使用 removeAllretainAll 等方法出现意外结果的原因是 java 方法不像典型的 CF 函数。它们通常对数据类型敏感。所以"2"(字符串)和val(2)(数字)被认为是不同的值/元素。除非您绝对确定两个数组中的数据类型匹配,否则最好使用 IMO 的其他方法。
    • 当然,如果您不确定某事,请始终采用更安全且经过验证的方式。
    • CF10+ 用户,请看我的其他回答。
    【解决方案2】:

    【讨论】:

    • +1,令人印象深刻的是你记得这个问题并在两年后回来改进它。
    【解决方案3】:

    如果您使用的是Railo,则可以使用ArrayMerge(例如&lt;cfset NewArray=ArrayMerge(FirstArray,SecondArray)&gt;)。

    【讨论】:

    【解决方案4】:

    coldfusion 错过了脚本语言所期望的许多基本功能,这有点愚蠢。这是我必须快速写下的。

    <cffunction name="mergeArrays" returntype="array" >
        <cfargument name="array1" type="array" required="true" >
        <cfargument name="array2" type="array" required="true" >
    
        <cfset arrayResult = arrayNew(1) >
        <cfloop array="#array1#" index="elem">
            <cfset arrayAppend(arrayResult,elem) >
        </cfloop>
    
        <cfloop array="#array2#" index="elem">
            <cfset arrayAppend(arrayResult,elem) >
        </cfloop>
    
        <cfreturn arrayResult>
    </cffunction>
    

    【讨论】:

      【解决方案5】:

      在 CF 10 或 Railo 4 中,您可以使用Underscore.cfc library 的 concat() 函数来获取一个由其他两个数组串联而成的新数组(无需修改现有数组)。示例cfscript:

      newArray = _.concat([1], [2]);
      

      结果:

      // newArray == [1, 2]
      

      使用此方法获取新数组比创建新数组并在其上调用 ArrayAppend 两次要干净一些。

      (免责声明:我写了 Underscore.cfc)

      【讨论】:

        【解决方案6】:

        在 javascript 中,array.join(s) 从由分隔符 s 分隔的数组的所有元素中创建一个字符串。 ColdFusion 中与此类似的函数是 ArrayToList 函数。至于将一个数组附加到另​​一个我不相信有一个 CF 函数。检查http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387 以查看 CF 中的数组函数列表。或者试试这样的:

        for(index = 1; index LTE ArrayLen(array2); i = i + 1) { ArrayAppend(array1, array2[i]); }

        【讨论】:

          【解决方案7】:

          您可以像这样轻松地连接两个列表:

          &lt;cfset combolist = ListAppend(lista,listb, ",")&gt;

          所以,首先使用ArrayToList() 将您的两个数组转换为列表。将两个列表与 ListAppend() 组合,然后将答案转换回带有ListToArray() 的数组。

          我不知道这效率如何,但代码很简单。我很想使用 arrayAppend() 但我在 ColdFusion 8 中。

          【讨论】:

          • 请记住,它不是完全等效的,因为它会 a) 删除任何空数组元素和 b) 在使用 , 的任何分隔符上拆分数组值。即单个值arr[1] ="Doe, John" 将变为arr[1] = Doe, arr[2] = John
          • Leigh,你说得很好。这可以通过使用不同的列表分隔符来解决,例如~~~,或~!~!~!不太可能出现在数组中。
          • 是的,尽管在这种情况下多个字符不起作用。在大多数 CF 版本中,多个字符被视为单独的分隔符。即~! 表示CF 看到由~ OR ! 分隔的值。 (CF10 中的情况可能发生了变化)。使用像 ascii 30 和 preserving empty list elements 这样的单个字符应该会更接近。
          【解决方案8】:

          我从 Ben Nadel 那里得到这个,并用它来执行加密和散列。像魅力一样工作!

          <cfscript>
              // Note: BinaryDecode/CharsetDecode return java arrays. 
              // Unlike CF arrays, java arrays are immutable, 
              // so the Java addAll(..) method to merge arrays won't work here. 
              // http://stackoverflow.com/a/10760835/104223
          
              // function to merge immutable arrays the long way
              function mergeArrays( array1, array2 ){
                  var i = 0;
                  var newArray = [];
                  for (i = 1; i <= arrayLen(arguments.array1); i++) {
                      arrayAppend(newArray, arguments.array1[i]);
                  }
                  for (i = 1; i <= arrayLen(arguments.array2); i++) {
                      arrayAppend(newArray, arguments.array2[i]);
                  }
                  return newArray;
              }
          
          
              //convert the saltArray string and CustomerID string to UTF-8 byte arrays.
              saltByteArray = charsetDecode(salt, "utf-8");
              CustomerIdByteArray = charsetDecode(CustomerId, "utf-8");
          
              //create a new byte array consisting of the CustomerId bytes
              //appended with the salt bytes by merging the two binary arrays 
              //via custom function, mergeArrays
              mergedBytes = mergeArrays( CustomerIdByteArray, saltByteArray );
          </cfscript>
          

          【讨论】:

          • 其实我想你是从我这里得到的,哈哈 .. 看着这个帖子,可能是从@noj 的回答中得到的,并在 cfscript 中重写了它;)跨度>
          【解决方案9】:

          是的,ColdFusion(10+) 有一个内置函数来追加两个数组。

          脚本版本:array1.append(array2, true);

          标签版本:arrayAppend(array1, array2, true);

          【讨论】:

            猜你喜欢
            • 2019-05-12
            • 2019-12-01
            • 1970-01-01
            • 2012-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多