在 ColdFusion 中,是否有一种内置的方式可以连接两个数组,类似于 JavaScript 的 array.concat()
方法?
在 ColdFusion 中,是否有一种内置的方式可以连接两个数组,类似于 JavaScript 的 array.concat()
方法?
不是真的,但猜猜怎么着? 就用Java吧! :)
<cfset foo = [1,2,3]>
<cfset bar = [4,5,6]>
<cfset foo.addAll( bar )>
参考文献:Java的Collection接口API。
来源:http://www.aliaspooryorik.com/blog/index.cfm/e/posts.details/post/merging-two-arrays-267
CF10+,使用
arrayAppend(array1, array2, true);
如果您正在使用Railo,您可以使用ArrayMerge函数(例如:<cfset NewArray=ArrayMerge(FirstArray,SecondArray)>
)。
冷酷的事实是,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>
newArray = _.concat([1], [2]);
结果:
// newArray == [1, 2]
使用这种方法获取新数组比创建一个新数组并在其上调用ArrayAppend两次更加简洁。
(免责声明:我编写了Underscore.cfc)
我从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>
你可以像这样轻松地连接两个列表:
<cfset combolist = ListAppend(lista,listb, ",")>
因此,首先使用ArrayToList()
将两个数组转换为列表。使用ListAppend()组合两个列表,然后使用ListToArray()
将答案转换回数组。
我不知道这有多有效率,但代码非常简单。我很想使用arrayAppend(),但我在ColdFusion 8中。
arr[1] ="Doe, John"
将变成 arr[1] = Doe,arr[2] = John
。 - Leigh~!
表示 CF 将值视为由 ~
或者 !
分隔。 (在CF10中可能已经改变)。使用像ascii 30这样的单个字符,并保留空列表元素,应该可以更接近目标。 - Leigh<cfscript> for(index = 1; index LTE ArrayLen(array2); i = i + 1) { ArrayAppend(array1, array2[i]); } </cfscript>
是的,ColdFusion(10+)有一个内置函数来追加两个数组。
脚本版本:array1.append(array2, true);
标签版本:arrayAppend(array1, array2, true);
removeAll
、retainAll
等方法导致意外结果的原因是Java方法不像你典型的CF函数那样宽容。它们通常对数据类型敏感。所以"2"
(字符串)和val(2)
(数字)被认为是不同的值/元素。除非你确信两个数组中的数据类型匹配,否则我认为你最好使用其他方法。 - Leigh