在ColdFusion中合并两个数组

36

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

9个回答

50

2
有趣的是,底层Java方法并不总是按预期工作。我仍然没有完全弄清楚何时以及为什么。我经常使用Java方法来删除重复项、连接和排序数组,我记得有时它不起作用取决于你如何创建数组、在调用Java方法之前执行哪些操作等等。因此要注意! - zarko.susnjar
1
@zarko.susnjar - 我知道这是一个旧的帖子,但是使用removeAllretainAll等方法导致意外结果的原因是Java方法不像你典型的CF函数那样宽容。它们通常对数据类型敏感。所以"2"(字符串)和val(2)(数字)被认为是不同的值/元素。除非你确信两个数组中的数据类型匹配,否则我认为你最好使用其他方法。 - Leigh
2
当然,如果你对某些事情不确定,总是要走更安全、经过验证的方式。 - zarko.susnjar
1
CF10+用户,请查看我的其他答案。 - Henry

49

12
你还记得这个问题,并在两年后回来改进它,这令人印象深刻。 - John

8

如果您正在使用Railo,您可以使用ArrayMerge函数(例如:<cfset NewArray=ArrayMerge(FirstArray,SecondArray)>)。


2
我已经在Adobe的ColdFusion Bug Tracker上添加了一个功能请求,网址为http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=83397。请投票支持它! :) - Henry
数组连接(ArrayConcat) vs. 数组合并(ArrayMerge) vs. 数组追加(ArrayAppend)?请在此处讨论:http://groups.google.com/group/cfml-conventional-wisdom/browse_thread/thread/95a4b511128c37ae - Henry

7

冷酷的事实是,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>

1
在CF 10或Railo 4中,您可以使用Underscore.cfc库的concat()函数来获取一个新数组,该数组是两个其他数组的连接(而不修改现有数组)。 cfscript示例:
newArray = _.concat([1], [2]);

结果:

// newArray == [1, 2]

使用这种方法获取新数组比创建一个新数组并在其上调用ArrayAppend两次更加简洁。

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


0

我从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重写了一遍 ;) - Leigh

0

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

<cfset combolist = ListAppend(lista,listb, ",")>

因此,首先使用ArrayToList()将两个数组转换为列表。使用ListAppend()组合两个列表,然后使用ListToArray()将答案转换回数组。

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


请记住,这并不是完全等价的,因为它将 a) 删除任何空数组元素,并 b) 在使用逗号分隔符的情况下拆分数组值。例如,单个值 arr[1] ="Doe, John" 将变成 arr[1] = Doe,arr[2] = John - Leigh
Leigh,你说得很对。这可以通过使用不同的列表分隔符(例如~~~或!~!)来解决,这些分隔符不太可能出现在数组中。 - Betty Mock
真的,虽然在这种情况下多个字符不起作用。在大多数版本的CF中,多个字符被视为单独的分隔符。例如 ~! 表示 CF 将值视为由 ~ 或者 ! 分隔。 (在CF10中可能已经改变)。使用像ascii 30这样的单个字符,并保留空列表元素,应该可以更接近目标。 - Leigh

0
在JavaScript中,array.join(s)将通过定界符s分隔符将数组的所有元素创建为一个字符串。ColdFusion中类似的功能是ArrayToList函数。至于将一个数组附加到另一个数组,我不认为有CF函数可以实现。请查看http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387以查看CF中的数组函数列表。或者尝试像这样的操作:
<cfscript>
   for(index = 1; index LTE ArrayLen(array2); i = i + 1) {
      ArrayAppend(array1, array2[i]);
  }
</cfscript>

0

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

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

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


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