2010-06-21 12 views

Antwort

47

Nicht wirklich, aber raten Sie mal, verwenden Sie einfach Java! :)

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

Referenz: Java's Collection Interface API.

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

+2

Seltsamerweise funktionieren zugrunde liegenden Java-Methoden nicht immer wie erwartet. Ich habe immer noch nicht genau herausgefunden wann und warum.Ich benutze oft Java-Methoden zum Entfernen von Duplikaten, Verbinden und Sortieren von Arrays, ich erinnere mich, dass es manchmal nicht funktionierte, je nachdem, wie man Arrays erstellt, welche Operationen du vor dem Aufruf der Java-Methode ausführst. –

+1

@ zarko.susnjar - Ich weiß, das ist ein alter Thread, aber der Grund für die unerwarteten Ergebnisse mit Methoden wie 'removeAll',' retainAll' usw. ist, dass die Java-Methoden nicht so nachsichtig sind wie Ihre typische CF-Funktion. Sie sind normalerweise datensensitiv. So werden '2 '' (string) und 'val (2)' (number) als unterschiedliche Werte/Elemente betrachtet. Wenn Sie nicht absolut sicher sind, dass die Datentypen in beiden Arrays übereinstimmen, verwenden Sie besser andere IMO-Methoden. – Leigh

+2

Natürlich, wenn Sie sich über etwas nicht sicher sind, gehen Sie immer den sichereren und bewährten Weg. –

8

Wenn Sie Railo verwenden, können Sie ArrayMerge (z <cfset NewArray=ArrayMerge(FirstArray,SecondArray)>) verwenden.

+2

Ich habe den ColdFusion Bug Tracker von Adobe als Feature-Anfrage unter http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=83397 hinzugefügt. Stimme es ab! :) – Henry

+0

ArrayConcat Vs. ArrayMerge Vs ArrayAppend? Bitte diskutieren Sie hier: http://groups.google.com/group/cfml-conventional-wisdom/browse_thread/thread/95a4b511128c37ae – Henry

0

In Javascript erstellt array.join (s) eine Zeichenfolge aus allen Elementen des Arrays, die durch das Trennzeichen getrennt sind. Eine ähnliche Funktion in ColdFusion ist die ArrayToList-Funktion. Was das Anhängen eines Arrays an ein anderes betrifft, glaube ich nicht, dass es eine CF-Funktion dafür gibt. Überprüfen Sie http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387, um die Liste der Array-Funktionen in CF anzuzeigen. Oder versuchen, etwas wie folgt aus:

 
<cfscript> 
    for(index = 1; index LTE ArrayLen(array2); i = i + 1) { 
     ArrayAppend(array1, array2[i]); 
    } 
</cfscript> 
+0

danke, ich meinte array.concat. Ich habe die Frage – Yisroel

6

Sein irgendwie dumm, wie Coldfusion viele grundlegende Funktionen vermisst, die man von einer Skriptsprache erwartet. Hier ist eine, die ich schnell schreiben musste.

<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

In CF 10 oder Railo 4, können Sie die concat() Funktion der Underscore.cfc library verwenden, um ein neues Array zu erhalten, die eine Verkettung ist von zwei andere Arrays (ohne die bestehenden Arrays zu modifizieren). Beispiel cfscript:

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

Ergebnis:

// newArray == [1, 2] 

Mit dieser Methode ein neues Array zu erhalten, ist ein bisschen sauberer als ein neues Array erstellen und zweimal auf sie rufen Arrayappend.

(Disclaimer: Ich schrieb Underscore.cfc)

0

Ich nahm dieses von Ben Nadel und dem verwendeten Verschlüsselung und Hashing auszuführen. Lief wie am Schnürchen!

<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> 
+0

Eigentlich glaube ich, dass du es von mir hast, haha ​​... und diesen Thread anschauend, * ich * habe es wahrscheinlich von @nojs Antwort bekommen und es in cfscript umgeschrieben;) – Leigh

0

Sie können ganz einfach zwei Listen wie diese verketten:

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

Also, zuerst Ihre beiden Arrays auf Listen konvertieren ArrayToList() verwenden. Kombinieren Sie die beiden Listen mit dem ListAppend() und konvertieren Sie die Antwort dann in ein Array mit ListToArray().

Ich weiß nicht, wie effizient das ist, aber der Code ist sehr einfach. Ich würde gerne das ArrayAppend() verwenden, aber ich bin in ColdFusion 8.

+0

Bedenke nur, dass es kein komplettes Äquivalent ist wie es wird a) leere Array-Elemente löschen und b) Array-Werte auf jedes Trennzeichen aufteilen '' '. dh der einzelne Wert "arr [1] =" Doe, John "würde" arr [1] = Doe, arr [2] = John "werden. – Leigh

+0

Leigh, du machst einen guten Punkt. Dies könnte mit einem anderen Listenbegrenzer wie ~~~ oder ~! ~! ~! was wahrscheinlich nicht innerhalb des Arrays erscheinen würde. –

+0

Richtig, obwohl mehrere Zeichen in diesem Fall nicht funktionieren. In den meisten Versionen von CF werden mehrere Zeichen als separate Trennzeichen behandelt. Dh '~!' bedeutet, dass CF die Werte durch '~' ** ODER ** '!' abgegrenzt sieht. (Möglicherweise haben sich die Dinge in CF10 geändert). Mit einem einzelnen Zeichen wie ASCII 30 und [leere Listenelemente erhalten] (http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_l_21.html) sollte es viel näher kommen. – Leigh