Arrays copias

Recuerda que los arrays son objetos y no se puede usar el operador de asignación (=) para copiar el contenido. Este operador copiaría una referencia, no los valores.

Así que para copiar arrays o se usa un bucle o un método iterador que procesa y copia los elementos de un array en otro. Estos métodos devuelven un nuevo array con todos o parte de los elementos del array de partida.

Para esta operación tenemos tres métodos, en ninguno se modifica el array original.

  • slice() Copia una serie de elementos contiguos
  • map() Aplica una función que modifica cada elemento antes de copiarlo
  • filter() Filtra sin modificar, los elmentos que se van a copiar al nuevo array

El método más simple para copiar un array es array.slice(). Este método permite copiar fragmentos de un array para anotarlos en un nuevo array.

Puede recibir dos argumentos:

  • el primero indica el índice del primer elemento que se copia
  • ell segundo señala el índice siguietne al final del fragmento a copiar.

El array original no se modifica, solo se copia. No se trata de extraer elementos sino de copiar.

Si no se pone ningún argumento se copia el array completo.

var datos=[6,5,4,9,19,17];

var copia;

copia = datos.slice(1,4);

console.log(copia);

Un detalle sobre el segundo argumento, el límite de copia. Si es negativo el elemento final es el que diga el argumento pero contando desde el final.

Así -1 como segundo argumento indica que el final de la copia es el penúltimo elemento del array.

var frutas=["Pera", "Manzana","Uva", "Melón","Durazno"];

var copia;

copia = frutas.slice(1,-1);

console.log(copia); //Manzana, Uva, Melón

Puedes comprobar que frutas no se modifica y que el array copia contiene los datos copiados.

Teniendo en cuenta que los arrays son referencias este método es uno de los más adecuados para copiar arrays.

El método map(callback, [thisnuevo] ) usa el array como entrada, lee cada elemento, le aplica una función de llamada (callback function) y el resultado lo inserta en un array vacio. Este array es devuelto como un nuevo array.

La función de llamada que procesa los elementos del array puede recibir hasta tres argumentos, en este orden: valor del elmento, índice del elmento y el array completo.

Así podemos copiar un array en otro, modificando o sin modificar los items. Este sistema de función de llamada (callback) también se usa en el recorrido de arrays para procesar cada elemento de un array.

var frutas = Array.of('pera', 'manzana', 'uva');

var compra = {};

compra = frutas.map( function( v ){ return v })

Esto sería una simple copia de un array en otro, al final compras contiene exactamente lo mismo que frutas. La función de llamada simplemente lee el valor de cada elemento y lo devuelve sin modificar.

var frutas = Array.of('pera', 'manzana', 'uva');

var compra = {};

compra = frutas.map( function( v ){ return v+"s" })

Este otro simplmente pone cada nombre de fruta en plural. Ahora lee cada elemento y le añade una s final y luego de devuelve para ser anotado en el array copia.

Junto a la función callback, el método puede usar un segundo argumento que se usa como variable this en la ejecución de la función.

var cantidades=[4,5,6];

var precios = [10, 20,12];

var compra = {};

compra = precios.map( function( v, i){ return v*this[ i ] }, cantidades)

console.log(compra) //40, 200, 72

La variable cantidades se usa como valor para this dentro de la función. En este caso se ha usado otro array pero puede ser cualquier otro objeto. Por ejemplo vamos a sumar 5 a cada precio

var precios = [10, 20,12];

var sumar = 5

var compra = {};

compra = precios.map( function( v, i){ return v + this }, sumar)

console.log(compra)   //[15,25,17]

Como siempre se puede usar una funcion anónima, pero si se va a usar una función muy compleja, con mucho código mejor usar una variable función.

El último método de copia de arrays es filter(callback [, thisnuevo]), es muy parecido al anterior pero no modifica los valores del array, sino que elije los elementos que cumplen con una condición dada en forma de función callback (con los habituales parámetros valor, indice, array). Si la función devuelve true se anota en la función copia y si no se saltan

var numeros = [10, 21,12];

pares = numeros.filter(function(v){return v%2 ==0});

console.log( pares);   //10,12

Al igual que el método map, este método puede recibir un segundo argumento para usar en la función de llamada como variable this. Esto podría usarse para calcular la intersección de dos arrays, o sea, para obtener los valores comunes.

var plantas = ['rosa', 'col', 'alheli', 'zanahoria', 'tomate'];

var flores =['rosa','alheli','caléndula', 'gardenia']

var jardin = plantas.filter(function(v){return this.includes(v)}, flores);

console.log( jardin);  //['rosa','alheli']

En este ejemplo, se recorre el array plantas, para cada elemento la función de llamada comprueba si está contendio en el array flores, usando el método flores.includes(), si está lo copia. Esto lo hace así porque el objeto this aputna a flores. Con este ejemplo hemos realizado la intersección de dos listas.