2010-06-21 29 views

Respuesta

47

No realmente, pero adivina qué, ¡solo usa Java! :)

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

referencia: Java's Collection Interface API.

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

+2

Por extraño que parezca, los métodos subyacentes de Java no funcionan siempre como se esperaba. Todavía no entiendo exactamente cuándo y por qué.A menudo utilizo métodos Java para eliminar duplicados, unir y ordenar matrices, recuerdo que a veces no funcionaba dependiendo de cómo se crean las matrices, qué operaciones se realizan antes de llamar al método Java, etc. ¡Así que preste atención! –

+1

@ zarko.susnjar - Sé que este es un hilo viejo, pero el motivo de los resultados inesperados con métodos como 'removeAll',' retainAll', etcétera es que los métodos de Java no son tan indulgentes como la función CF típica. Por lo general, son sensibles al tipo de datos. Así que '" 2 "' (cadena) y 'val (2)' (número) se consideran valores/elementos diferentes. A menos que esté absolutamente seguro de que los tipos de datos en ambas matrices coinciden, es mejor que utilice otros métodos IMO. – Leigh

+2

Por supuesto, si no está seguro de algo, siempre vaya de la manera más segura y probada. –

8

Si está utilizando Railo, puede utilizar ArrayMerge (Por ejemplo <cfset NewArray=ArrayMerge(FirstArray,SecondArray)>).

+2

He agregado a ColdFusion Bug Tracker de Adobe como solicitud de funciones en http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=83397. ¡Vota! :) – Henry

+0

ArrayConcat vs. ArrayMerge Vs ArrayAppend? Discuta aquí: http://groups.google.com/group/cfml-conventional-wisdom/browse_thread/thread/95a4b511128c37ae – Henry

0

En javascript array.join (s) crea una cadena de todos los elementos de la matriz separados por los delimitadores. Una función similar a esto en ColdFusion es la función ArrayToList. En cuanto a agregar una matriz a otra, no creo que haya una función CF para eso. Consulte http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions-pt0_03.html#3473387 para ver la lista de funciones de matriz en CF. O intentar algo como esto:

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

gracias, me refiero a array.concat. Arreglé la pregunta – Yisroel

6

Su poco tonto cómo ColdFusion pierde muchas de las funciones básicas que uno esperaría de un lenguaje de script. Aquí hay uno que tuve que escribir rápidamente.

<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

En la FQ 10 o Railo 4, puede utilizar la función concat() de la Underscore.cfc library para obtener una nueva matriz que es una concatenación de otras dos matrices (sin modificar las matrices existentes). Ejemplo cfscript:

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

Resultado:

// newArray == [1, 2] 

El uso de este método para obtener una nueva matriz es un poco más limpio que la creación de una nueva matriz y llamando ArrayAppend en él dos veces.

(Negación: Escribí Underscore.cfc)

0

Tomé esta Nadel de Ben y lo utilizó para realizar el cifrado y hash. ¡Trabajado como un encanto!

<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

En realidad creo que lo obtuviste de mí, jaja ... y mirando este hilo, * Yo * probablemente lo obtuve de la respuesta de @noj y lo reescribí en cfscript;) – Leigh

0

Puede concatenar dos listas fácilmente así:

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

Por lo tanto, primero convertir sus órdenes de dos de las listas utilizando ArrayToList(). Combine las dos listas con ListAppend() y luego convierta la respuesta a una matriz con ListToArray().

No sé qué tan eficiente es esto, pero el código es muy simple. Me encantaría usar el arrayAppend() pero estoy en ColdFusion 8.

+0

Solo ten en cuenta que no es un equivalente completo como lo hará a) soltar cualquier elemento vacío de la matriz y b) dividir los valores de la matriz en cualquier delimitador que se use ','. es decir, el valor único 'arr [1] =" Doe, John "' se convertiría en 'arr [1] = Doe, arr [2] = John'. – Leigh

+0

Leigh, haz un buen punto. Esto podría solucionarse utilizando un delimitador de lista diferente, como ~~~, o ~! ~! ~! que probablemente no aparecería dentro de la matriz. –

+0

Es cierto, aunque varios caracteres no funcionarán en este caso. En la mayoría de las versiones de CF, los caracteres múltiples se tratan como delimitadores separados. es decir, '~!' significa que CF ve los valores como delimitados por '~' ** OR ** '!'. (Las cosas pueden haber cambiado en CF10). El uso de un solo carácter como ascii 30 y [preservar los elementos de la lista vacía] (http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_l_21.html) debería acercarse mucho más. – Leigh