Join Two Arrays in ColdFusion
Asked Answered
S

9

36

Is there a built-in way to join two arrays in ColdFusion, similar to JavaScript's array.concat()?

Shrunk answered 21/6, 2010 at 2:8 Comment(0)
E
50

Not really, but guess what, just use Java! :)

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

reference: Java's Collection Interface API.

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

Earplug answered 21/6, 2010 at 2:13 Comment(4)
Oddly enough, underlying Java methods do not work always as expected. I still haven't figure out exactly when and why. I often use Java methods for removing duplicates, joining and sorting Arrays, I remember sometimes it didn't work depending how you create arrays, which operations you perform before calling Java method etc. So pay attention!Spaulding
@Spaulding - I know this is an old thread, but the reason for the unexpected results with methods like removeAll, retainAll, etcetera is that the java methods are not as lenient as your typical CF function. They are usually data type sensitive. So "2" (string) and val(2) (number) are considered different values/elements. Unless you are absolutely certain the data types in both arrays match, you are better of using other methods IMO.Nonalignment
Of course, if you are not certain about something, always go the safer and proven way.Spaulding
CF10+ user, pls see my other answer.Earplug
E
49

CF10+, use

arrayAppend(array1, array2, true);

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arrayappend.html

Earplug answered 4/6, 2012 at 18:11 Comment(1)
+1, It is impressive that you remembered this question and came back two years later to improve it.Franchot
D
8

If you're using Railo, you can use ArrayMerge (E.g. <cfset NewArray=ArrayMerge(FirstArray,SecondArray)>).

Daughterly answered 21/6, 2010 at 2:55 Comment(2)
I've added to Adobe's ColdFusion Bug Tracker as feature request at cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/… . Vote it up! :)Earplug
ArrayConcat Vs. ArrayMerge Vs ArrayAppend ? Please discuss here: groups.google.com/group/cfml-conventional-wisdom/browse_thread/…Earplug
S
7

Its kinda dumb how coldfusion misses many basic functions that one would expect from a scripting language. Here's one I had to write quickly.

<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>
Sapindaceous answered 1/2, 2011 at 0:54 Comment(0)
T
1

In CF 10 or Railo 4, you can use the concat() function of the Underscore.cfc library to get a new array that is a concatenation of two other arrays (without modifying the existing arrays). Example cfscript:

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

Result:

// newArray == [1, 2]

Using this method to get a new array is a bit cleaner than creating a new array and calling ArrayAppend on it twice.

(Disclaimer: I wrote Underscore.cfc)

Tricksy answered 12/8, 2012 at 19:15 Comment(0)
F
0

In javascript array.join(s) creates a string out of all of the elements of the array separated by the delimiter s. A similar function to this in ColdFusion is the ArrayToList function. As far as appending an array to another I don't believe there is a CF function for that. Check http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387 to see the list of Array functions in CF. Or try something like this:

<cfscript>
   for(index = 1; index LTE ArrayLen(array2); i = i + 1) {
      ArrayAppend(array1, array2[i]);
  }
</cfscript>
Ferrell answered 23/6, 2010 at 21:44 Comment(0)
L
0

I took this from Ben Nadel and used it to perform encryption and hashing. Worked like a charm!

<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. 
    // https://mcmap.net/q/427125/-sha-512-hashing-a-byte-array-in-coldfusion

    // 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>
Lofton answered 6/12, 2012 at 21:56 Comment(1)
Actually I think you got it from me, haha .. and looking at this thread, I probably got it from @noj's answer and rewrote it in cfscript ;)Nonalignment
A
0

You can easily concatenate two lists like this:

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

So, first convert your two arrays to lists using ArrayToList(). Combine the two lists with the ListAppend() and then convert the answer back to an array with ListToArray().

I don't know how efficient this is, but the code is very simple. I'd love to use the arrayAppend() but I'm in ColdFusion 8.

Andrien answered 12/3, 2013 at 4:7 Comment(3)
Just keep in mind it is not a complete equivalent as it will a) drop any empty array elements and b) split array values on whatever delimiter is used ,. ie The single value arr[1] ="Doe, John" would become arr[1] = Doe, arr[2] = John.Nonalignment
Leigh, you make a good point. This could be worked around by using a different list delimiter, such as ~~~, or ~!~!~! which would not likely appear within the array.Andrien
True, though multiple characters will not not work in this case. In most versions of CF, multiple characters are treated as separate delimiters. ie ~! means CF sees the values as delimited by ~ OR !. (Things may have changed in CF10). Using a single character like ascii 30, and preserving empty list elements, should get it much closer.Nonalignment
F
0

Yes, ColdFusion(10+) has an inbuilt function to append two arrays.

Script version : array1.append(array2, true);

Tag version: arrayAppend(array1, array2, true);

Filet answered 4/8, 2020 at 21:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.