Combinar y ordenar colecciones

Traducido automáticamente de Deepl

4D v16 R6 opens a wide range of possibilities to manage collections. Mnvertir dos coleccionesen una, clonar o simplemente ordenar una colección es tan fácil como llamar a un método. Ahorra un tiempo muy valioso, por ejemplo, cuando se necesita concatenar dos colecciones, conservar sólo los valores distintos u ordenarlos.

Este artículo es parte de una serie que demuestra cómo manipular colecciones utilizando los métodos añadidos en 4D v16 R6. Para aprender aún más, descarga nuestro ejemplo de base de datos, que incluye 12 ejemplos diferentes para mostrar lo que puedes hacer con los métodos de colección.

Ejemplo de base de datos: Manejar colecciones

Copiar una colección

Copia profunda

El método copy devuelve una copia profunda de la instancia de la colección. Una copia profunda significa que todos los elementos de la colección original están duplicados y no comparten ninguna referencia con la colección devuelta.

En el ejemplo siguiente, la realización de una copia profunda mediante el método copy añade un nuevo elemento a $col2 (a copy of the first collection – $col). An elemento adicional se añade a $col2, however $col remains unchanged:

//crear una colección
$col
:=Nuevacolección("a"; "b"; "c"; "d"; "e")
//hacer una copia profunda de la primera colección
$col2:=$col.copy($col)
//añade un nuevo elemento a la copia de la primera colección
$col2.push("f")
// $col=["a", "b", "c", "d, "e"]

// $col2=["a", "b", "c", "d, "e", "f"]

Copia superficial

Cuando se realiza una copia superficial de una colección, los elementos de la colección original comparten sus referencias con la colección devuelta. Por ejemplo, si se crea una colección, se hace una copia superficial típica de la misma y luego se añade un nuevo elemento a la copia ($col2)), la colección original ($col) también reflejará el cambio porque $col y $col2 comparten su referencia:

//crear una colección
$col
:=Nuevacolección("a"; "b"; "c"; "d"; "e")
//hacer una copia superficial de la primera colección
$col2:=$col

//añadir un nuevo elemento a la copia de la primera colección

$col2.push("f")
// $col2=$col=["a", "b", "c", "d, "e", "f"]

Puedes crear una copia superficial de una parte de una colección utilizando el método slice método:

//create a collection
$col
:=New collection("a"; "b"; "c"; "d"; "e")
// Copy from index 2 and stop at end of collection -1
$col2 :=$col.slice(2;-1)
//$col2=[c,d]

Combinación de colecciones

La concatenación de dos colecciones se puede hacer utilizando el método concat o combine .

El método concat devuelve una nueva colección con la concatenación de las dos colecciones:

//create 2 collections
$
col:=Nuevacolección("a"; "b"; "c")
$col2:=Nuevacolección(1;2;3)
//combinar las 2 colecciones en una 3ª colección
$col3:=$col.concat($col2)
//$col3=["a", "b", "c",1,2,3]

El método combine añade cada elemento de una colección (pasada como parámetro) al final de la colección original:

//create 2 collections
$col
:=Nuevacolección("a"; "b"; "c")
$col2:=Nuevacolección(1;2;3)
//añade la segunda colección al final de la primera
$col.combine($col2)
//$col=["a", "b", "c",1,2,3]

El método distinct crea una nueva colección que sólo contiene valores distintos (diferentes) de la colección original:

$col:=New collection("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2 :=$col.distinct()
//$col2=[a,b,c,d,e]

Ordenar una colección

Para ordenar una colección, se puede utilizar el método sort o orderBy para ordenar una colección. El método sort modifica la colección original, mientras que el método orderBy devuelve una colección completamente nueva (copia superficial) y ordenada, pero no modifica la colección original:

$col:=Nuevacolección("a"; "b"; "c"; "a"; "b"; "c"; "d"; "e")
$col2:=$col.orderBy()
//$col2=["a", "a", "b", "b", "c", "c", "d", "e"]

//$col=["a", "b", "c", "a", "b", "c", "d", "e"]

$col.sort()
//$col=["a", "a", "b", "b", "c", "c", "d", "e"]

También se puede ordenar una colección utilizando sort o orderByMethodque requiere un método de devolución de llamada:

$col:=Nuevacolección("Naranja"; "Manzana"; "Uva"; "Pera"; "Plátano"; "Higo"; "Zarzamora"; "Maracuyá")
$col2:=$col.orderByMethod("WordLength")
//$col2=[Maracuyá,Zarzamora,Naranja,Plátano,Manzana,Uva,Pera,Higo]
$col.sort("WordLength")
//$col=[Maracuyá,Zarzamora,Naranja,Plátano,Manzana,Uva,Pera,Higo]

Donde el método de devolución de llamada WordLength es uno de los métodos de su proyecto:

$1.resultado:=Longitud(Cadena($1.valor))>Longitud(Cadena($1.valor2))

Por último, puede hacer una copia profunda de una colección con todos sus elementos en orden inverso utilizando reverse:

$col:=Nuevacolección(1;3;5;2;4;6)
$col2:=$col.reverse()
//$c2=[6,4,2,5,3,1]

Fabrice Mainguené
- Product Owner -Fabrice Mainguené se unió al equipo de 4D Program en noviembre de 2016. Como Product Owner, está a cargo de escribir las historias de usuario y luego traducirlas a especificaciones funcionales. Su papel es también asegurarse de que la implementación de la característica entregada cumple con las necesidades del cliente. Después de obtener una licenciatura en Ciencias de la Computación en el CNAM, Fabrice se unió a una pequeña empresa de publicación de software como desarrollador Windev. A continuación, trabajó para diferentes empresas del sector industrial y comercial como desarrollador de Windev y de la web, así como asesor técnico de nuevas funcionalidades.