Nov 28 2022

duduromeroa.com

#Javascript, #DOMJs, #webinteractiva, #Interfaces, #duduromeroa, #Guayaquil

Javascript

28 métodos de arreglos para Javascript. Programación para web (4.1/8):


George Póyla, matemático. Resolver problemas de diseño. www.duduromeroa.com

Por Eduardo J. Romero Andrade
| Guayaquil

Contacto duduromeroa@gmail.com



JAVASCRIPT CREA ACCIÓN MEDIANTE MÉTODOS

Toda acción altera el entorno. Por ejemplo, una lluvia imprevista puede alterar las propiedades de la superficie de una camisa bien planchada. Así mismo, en lenguajes de programación con orientación a objetos las acciones -como insertar un nuevo dato o borrarlo- son ejecutadas por los métodos.

Para Antani y Stefanov[4] las acciones en programación serían como los verbos de cualquier idioma. Como en la camisa empapada por una lluvia de invierno guayaco: la propiedad de 'textura' se vería alterada en su valor: pasaría de 'planchada' a 'mojada'.

En códigoFalso

elemento : camisa;
estadoElemento : planchada;

acción(elemento){
hayLLuvia : si;
nuevoEstado : mojado;
}
resultado : elemento.nuevoEstado;

En las siguientes secciones se detallarán los métodos -acciones- incorporados en Javascript para alterar datos alfanuméricos. En JS los métodos se agrupan en:

MÉTODOS DE ARREGLOS
ARRAY.FROM()

Genera una copia de arreglo de un conjunto de elementos, recorridos y apuntados. Esos subelementos pueden ya estar en un conjunto general (como las letras de una palabra), o ser únicamente números que a su vez, también pueden ser alterados mediante una interna función flecha desde Array.from

Los subelementos 'leídos' viables para generar el arreglo son todos: desde caracteres, espacios en blanco, y todo lo que esté dentro del conjunto. Cada elemento será separado por una coma.

En Javascript

let nombre = "dudu";
console.log(Array.from(nombre));
// [ 'd', 'u', 'd', 'u' ]

Otra forma de generar un arreglo con Array.from() es a partir de los argumentos (mediante el objeto arguments) desde una función:

En Javascript

// Aquí la función no tiene parámetros
function f() {
// Devuelve los parametros
return Array.from(arguments);
}

// Se muestran los argumentos
console.log( f("dato1", "dato2", 3,4,5) );

ARRAY.IS.ARRAY()

Evalúa si un valor creado como arreglo es un dato arreglo. Devuelve true si lo es, y false si no. Esa función detectará al arreglo aún si entre las llaves rectas [...] no hay datos. Si la función tiene incorrecta sintaxis -como no separar los elementos mediante comas- el códido dará error.

En Javascript

const arreglo = [1, 2, 3];
// Evalua si es un dato arreglo
const evaluarArreglo = Array.isArray(arreglo);
console.log(evaluarArreglo); 
// true

const noEsArreglo = {};
// Evalua si es un dato arreglo
const nuevaEval = Array.isArray(noEsArreglo);
console.log(nuevaEval); 
// false

En otro ejemplo, Array.isArray() es usado para determinar si un dato ingresado es efectivamente un arreglo. Y si lo es, se generará una acción que altere sus elementos:

En Javascript

// Función aloja argumento
function crearValoresDobles(arreglo) {
// Método evalúa si el dato ES DE TIPO ARREGLO
if (Array.isArray(arreglo)) {
// Si es true....
/* 
- Se crea una variable que recorrerá el arreglo insertado
- Y en cada elemento recorrido, se lo multiplicará por dos */
for (let i = 0; i < arreglo.length; i++) {
arreglo[i] = arreglo[i] * 2;
}
// Devuelve el arrego
return arreglo;
// Si dato NO es Array
} else {
// SE CREA un objeto tipo Error
throw new Error(' - OJITO PANA: Se espera un dato arreglo!');
}
}

/* Se genera en un contexto diferente 
un dato tipo arreglo */
const nuevoArreglo = [1, 2, 3];
/* Se genera en un contexto diferente 
un dato QUE NO ES ARREGLO */
const noEsArreglo = 'hello';

console.log(crearValoresDobles(nuevoArreglo)); 
// [2, 4, 6]

//console.log(crearValoresDobles(noEsArreglo)); 
/* EN CASO DE QUE EL ARGUMENTO NO SEA UN ARREGLO, 
SE ENVIARÁ MEDIANTE CONSOLA EL SIGUIENTE MENSAJE */

/* throw new Error('Se espera que se inserte 
un dato arreglo. No importa si está vacio, 
pero debe ser sintácticamente correcto.'); */

MÉTODO POP()

Remueve el ÚLTIMO elemento de un arreglo, devolviéndolo. Además, SÍ altera la cantidad de elementos dentro del arreglo.

En Javascript

// Remover el último elemento con pop()
var menu = [
// Indice 0
"Ceviche de camarón o pulpo", 
// Indice 1
"guatita" 
];

/* Remueve el ÚLTIMO elemento
y lo muestra */
console.log(menu.pop());
// guatita

/* Al ser removido el ÚLTIMO elemento, 
el segundo elemento pasa a ser el primero */
console.log(menu[0]);
// Ceviche de camarón o pulpo

// Y el arreglo quedó solo con un elemento
console.log(menu.join(''));
// Ceviche de camarón o pulpo

MÉTODO SHIFT()

Remueve el PRIMER elemento de un arreglo, devolviéndolo. Además, altera la cantidad de elementos dentro del arreglo.

En Javascript

// Arreglo
const cosas = ['cubo', 'rueda', 'cilindro', 'esfera'];

// Remover y obtener el primer elemento del arreglo
const primerElemento = cosas.shift();
 
// Mostrar el primer elemento borrado
console.log(primerElemento); 
// cubo

// Actualizar arreglo
console.log(cosas);  
// [ 'rueda', 'cilindro', 'esfera' ]

// Mostrar los elementos sin [...]
console.log(cosas.join(', '));  
// rueda, cilindro, esfera

Otro ejemplo itera la remoción del primer elemento hasta vaciar el arreglo:

En Javascript

// Crea arreglo
const cosas = ["esfera", "cubo", "ovalo"];

/* Itera el borrado del primer elemento 
del arreglo y lo muestra */
function removerElPrimero() {

      /* Itera: mientras la longitud del arreglo sea cero */
      while (cosas.length > 0) {
      // Variable obtiene elemento borrado
      const primervalor = cosas.shift();
      // Muestra elemento borrado
      console.log(primervalor);
}
}

/* Invocar la función 'removerElPrimero' */
removerElPrimero(); 
// esfera cubo ovalo

// El arreglo ahora esta vacio
console.log(cosas);
// -> []

Una forma limpia de 'descargar' los elementos del arreglo para vaciarlo –pero al mismo tiempo mostrarlos– es la de mdn en 'Using shift() method in while loop' (abajo):

En Javascript

// Arreglo
const campeonato = ["Barcelona", "Aucas", "Emelec"];

// Inicializamos variable contador
 var c;

/* // Loop y condición: envia TRUE si 'c' 
NO ES igual a dato 'undefined' */
while (typeof (c = campeonato.shift()) !== 'undefined') {
  console.log(c);
}
//-> Barcelona
//-> Aucas
//-> Emelec

console.log(campeonato);
// []

Otro ejemplo de mdn web docs_ es:

En Javascript

var cositas = [
'Caja grande', 
'Caja mediana', 
'Caja pequeña'];

var item = "*";

// Arreglo actual
console.log(`${item} ` + 
'Primero es: ' + cositas);

// Arreglo Modificado
// Elimina el elemento [0]
var eliminado = cositas.shift();

// Muestra eliminado
console.log(`${item} ` + 
'Elemento eliminado: ' + eliminado);
 
// Arreglo actual
console.log(`${item} ` + 
"Ahora queda: " + cositas);

/*
* Primero es: Caja grande,Caja mediana,Caja pequeña
* Elemento eliminado: Caja grande
* Ahora queda: Caja mediana,Caja pequeña
*/

FLAT()

Toma los elementos en arreglos de más de una dimensión y los fusiona en un solo arreglo de una sola dimensión. flat() no altera el orden de los elementos dentro del arreglo.

En Javascript

 
// Arreglo con arreglos anidados
/* [.. [..], [[..], [..]]..] */
const arregloAnidado = [1, 2, 
[3, 4], 
[[5, 6], [7, 8]]
];

/* Valor flat('depth') */
/*Especifica la anidación del arreglo a aplanar */
/* Si el arreglo a aplanar tiene tres niveles de anidación, 
flat(2) aplanará solo los dos primeros niveles 
y dejará intacto el tercero. */
const arregloFusionado = arregloAnidado.flat(2);

console.log(arregloFusionado); 
// Output: [1, 2, 3, 4, 5, 6, 7, 8]

En otro ejercicio combinado usamos map() junto con flat() para aplanar y procesar los elementos del arreglo hacia un objetivo:

En Javascript

// Arreglo con tres niveles
const arrayAnidado = [[1, 2], [3, 4, [5, 6]]];
// Aplanar los niveles del arreglo en un solo nivel

/* Si no se le dice que aplane los dos niveles, 
dejará el último nivel como [5,6], 
por lo que al procesarlo con map() resutlará en undefined. */
const arrayAplanado = arrayAnidado.flat(2);
// Cada elemento del array aplanado doblar por dos
const arrayDoble = arrayAplanado.map(num => num * 2);

console.log(arrayDoble); 
// [2, 4, 6, 8, 10, 12]

RECORDAR

  • Un nivel es cada arreglo anidado.
  • Dos niveles de anidación significa que un arreglo agrupa dos conjuntos de brackets: [ [1,2], [3,4] ].
  • flat() -sin argumento- aplana por default a nivel 1. Eso quiere decir que solo aplanará uno de los niveles presentes.
  • Mediante flat( 2 ) pedimos que aplane los dos niveles hallados en el arreglo que estemos procesando.
MÉTODOS UNSHIFT

Este "agrega uno o más elementos al inicio [en la ubicación cero] del array, y devuelve la nueva longitud del array" (mdn web docs_).

Un ejemplo sencillo del uso de unshift() es:

En Javascript

// Arreglo
const numbers = [2, 3, 4];

// Agregar un valor resultante de una operación
numbers.unshift(8 * 2 + 5);

// Mostrar el arreglo actualizado
// join() para eliminar las llaves cuadradas
console.log(numbers.join(', ')); 
// 21, 2, 3, 4

Otro ejemplo más complejo podría ser:

En Javascript

// Arreglo con dos elementos
var generos = ['pop', 'punk'];

// Inserta nuevos elementos al arreglo
console.log("Cantidad de elementos: " + 
generos.unshift("hardcore", "heavy metal"));
/* Pero también devuelve cantidad de elementos del arreglo */

// Muestra arreglo completo
console.log("Mostrar arreglo completo:  " + generos);
/*
Cantidad de elementos: 4
Mostrar arreglo completo:  
hardcore,heavy metal,pop,punk 
*/

MÉTODO INCLUDES()

Método de respuestas binarias. Para mdn web docs_include() retorna true si un elemento está presente en un arreglo. Si no lo está, devuelve false.

En Javascript

const autores = [
"Bruno", 
"Ricardo", 
"Dudú", 
"Miguel"
];

/* arreglo.includes(elementoAbuscar) */
console.log(autores.includes("Bruno"));
// --> True

MÉTODO INDEXof

En la vida real existen elementos cuantificables que se repiten. Por ejemplo, en ciertas familias hay más de una persona con el mismo nombre. En JS la primera presencia de un elemento dentro de un arreglo se conoce con el anglicismo de ocurrence.

Para mdn web docs_indexOf() evalúa igualdad estricta -el elemento debe ser igual en valor y en tipo de dato para darlo como presente-. Si halla el elemento se retorna solo el primer índice del elemento requerido. Si no lo ubica, retorna -1.

let nombres = ["Edu", "José", "José", "Adrian" ];

// Ubicar índice de 'José'
console.log(nombres.indexOf("José"));
/* José aparece por primera vez en el índice...*/
// 1

// Ubicar índice de 'Adrian'
console.log(nombres.indexOf("Adrian"));
// 3

// Ubicar algo inexistente
console.log(nombres.indexOf("bla"));
// -1

Abajo, el argumento de indexOf() es el elemento a buscar. En el segundo ejemplo, se busca una palabra pero a partir de un índice dado en delante. indexOf() retornará únicamente el índice en donde esté ubicado el elemento a buscar:

En Javascript

 // ** EJEMPLO A **
let cosas = ["rojo", "verde", "azul"];
// Ubicar índice de 'verde'
console.log(cosas.indexOf("verde"));
// 1

// ** EJEMPLO B **
let himno = ["Salve", "oh", "patria", "mil", "veces"];

/* Guardar indice de 'mil'. 
Solo se buscará desde el índice 1 en adelante */
var buscar = himno.indexOf("mil", 1);

/* Invocar variable que guarda el 
índice del elemento requerido */
console.log(buscar);
// 3

/* // Invocar arreglo[elementoIndice]
para mostrar CUÁl es el elemento correspondiente al índice 3 */
console.log( himno[buscar] );
// 'mil'

/* O lo que es lo mismo */
console.log( himno[himno.indexOf("mil", 1)] );
// 'mil'

En otro ejemplo:

En Javascript

// Arreglo
const letras = ["aaa", "bbb", "ccc", "xxx"];

// Retorna primera ubicación de 'ccc'
console.log(letras.indexOf("ccc"));
// 2

/* Retorna primera ubicación de 'xxx' 
desde el índice cero */
console.log(letras.indexOf("xxx", 0));
// 3

// No halla 'yyy' en la ubicación cinco
console.log(letras.indexOf("yyy", 5));
// --> -1

/* La condicional debe evaluar 
igual o mayor a cero para 
el elemento hallado. */
if ( letras.indexOf("ccc") > 0 ) 
      console.log("'ccc' SÍ hallado"); 
      // 'ccc' fue hallado

/* La condicional debe evaluar 
menor a cero para elemento no
ubicado. */
if ( letras.indexOf("cosita") == -1 ) 
      console.log("'cosita' NO hallado "); 
      // 'cosita' NO hallado

MÉTODO LASTINDEXof()

Este método devuelve el último índice de ubicación en caso de que el elemento a buscar tenga más de una ocurrencia. RECORDAR: los elementos de un arreglo se cuentan desde el cero en adelante.

// Índices: cero, uno, dos, tres...
var indices = [0, 0, 0, 0, 0, 'A', 'A', 'A'];
var idx = indices.lastIndexOf("A");

// Retorna el último índice de 'A'
console.log("El último índice de 'A' es ", idx);
// El último índice de 'A' es  7 

Finalmente, se debe recordar que cualquier elemento no hallado por indexOf() o lastIndexOf() retornará el valor -1.

var indices = ["no", "no", "no"];
// Buscar con lastIndexOf()
var buscar1 = indices.lastIndexOf("si");
// Buscar con indexOf()
var buscar2 = indices.indexOf("si");

/* Si cualquiera de ambos resultados es -1*/
if ( buscar1 || buscar2 == -1){
console.log("No existe el elemento Sí");
}
// -> No existe el elemento "Sí""

MÉTODO MAP()

Crea nuevo arreglo con nuevos elementos alterando uno a uno los del primer arreglo original. Es decir, crea un nuevo arreglo con valores transformados uno a uno. Además, map() NO altera el arreglo original.

En Javascript

// Arreglo
const arreglo = [1, 2, 3];

/* Aloja alteración de cada elemento. 
Cada elemento suma 10 */
const nuevoArreglo = arreglo.map(item => item + 10);

// Invoca nuevo arreglo
console.log(nuevoArreglo.join(', '));  
// 11,12,13

// No altera el arreglo anterior
console.log(arreglo.join(', '));  
// 1, 2, 3

A partir de un nuevo arreglo, map()/ devuelve el arreglo modificado con nuevos valores, pero sin cambiar el arreglo original. El método map() no permite como argumento una función común –function tal()–. Solo permite invocar una función común desde su propio parámetro.

En Javascript

const musica = [
  { estilo: 'punk', inicio: 1979 },
  { estilo: 'hardcore', inicio: 1992 },
  { estilo: 'blues', inicio: 1955 }
];

const lista = musica.map(genero => genero.estilo);
console.log(lista.join(', '));
// punk, hardcore, blues

También para obtener propiedades de cada elemento, como su longitud de caracteres:

En Javascript

// Arreglos con elementos alfanumericos
const palabras = ['Guayaquil', 'de', 'mis...'];

/* Aloja nuevo arreglo que mide cantidad 
de caracteres de cada elemento mediante '.lenght' */
const cantidad = palabras.map(palabras => palabras.length);

/* Muestra cantidad de caracteres de cada elemento */
console.log(cantidad); 
// [ 1, 2, 6 ]

Y para obtener SOLO los valores de una sola propiedad:

En Javascript

// Arreglo con elementos objeto
/* Recordar: el último elemento NO tiene coma */
const ecu = [
      { prov: 'Guayas', capital: "GYE" },
      { prov: 'Pichincha', capital: "UIO" },
      { prov: 'Azuay', capital: "CUE" }
];

// Aloja solo valores de cierta propiedades
const valores = ecu.map(mostrar => mostrar.capital);

// Mostrar en forma de lista
console.log(valores.join('\n'));
/*
GYE
UIO
CUE
*/

Otro ejemplo usando map() y variables literales ${'...'}:

En Javascript

const comida = ['Quito', 'Cuenca', 'Guayaquil'];

/* nombreArreglo.map(valor => {...}) */
const result = comida.map(evaluado => {
  console.log(`${evaluado}, Ecuador.`);
});
/* 
Quito, Ecuador
Cuenca, Ecuador
Guayaquil, Ecuador
*/

Otros tres ejemplos del uso de map():

// Arreglo inicial
let arreglo = [10, 20, 30];
console.log("> Arreglo inicial : " + arreglo);

/* Map() permite una función flecha 
cuyo parámetro 'elemento' es identificado 
como cada iteración de los elementos del arreglo */  
let mapeo = arreglo.map(elemento => elemento + 1);
console.log("* Arreglo alterado : " + mapeo);
//-> [ 11, 21, 31, 41 ]

// + + + + + + 

/* Seguimos trabajando con el arreglo inicial */
const nuevoArr = arreglo.map(calculo);
function calculo(num) {
return num * 10;
}
console.log("* Arreglo alterado : " + nuevoArr);
//-> [ 100, 200, 300, 400 ]

// + + + + + + 

/* Seguimos trabajando con el arreglo inicial */
const nuevoCalculo = arreglo.map(Math.sqrt).join('\n');
console.log("* Arreglo alterado : " + nuevoCalculo);
// * Arreglo alterado : 3.1622776601683795,4.47213595499958,
5.477225575051661,6.324555320336759

// + + + + + + 

/* Aún así, el arreglo inicial sigue intacto */
console.log("> Arreglo inicial : " + arreglo);
//-> [ 10, 20, 30, 40 ]

/* 
> Arreglo inicial : 10,20,30
* Arreglo alterado : 11,21,31
* Arreglo alterado : 100,200,300
* Arreglo alterado : 3.1622776601683795
4.47213595499958
5.477225575051661
> Arreglo inicial : 10,20,30 */

Sin embargo, map() sí acepta como parámetro una función flecha. Ese parámetro –sea cual sea su nombre identificador– dentro de ese tipo de función flecha recibirá el elemento del arreglo.

Map() también permite reusar un arreglo alterado para activar otro método que también lo alteren:

En Javascript

// Primer arreglo
const numeros = [1, 2, 3];

// Aloja primer arreglo alterado cada elemento
const duplicados = numeros.map(numeros => numeros * 2);
// 2, 4, 6

/* Luego, aloja el arreglo anterior y lo 
vuelve a alterar mediante método reduce() */
const totalduplicados = duplicados.reduce(
(total, numeros) => total + numeros);
// Suma cada elemento aloja un solo resultado

console.log(totalduplicados);
// 12

MÉTODO REDUCE()

Itera y acumula el resultado de un valor según actividad de la función de retorno callBack. 'Lee' los elementos de izquierda a derecha. El método reduce() contiene un llamado a la función callback que a su vez, puede contener hasta dos parámetros: un valor acumulador y el elemento del arreglo que está siendo procesado.

En Javascript

// Aloja arreglo y elementos
const numeros = [10, 20, 30];
/* 
- Aloja acceso desde el arreglo 'numeros' hacia reduce()
- reduce() tiene dos parámetros
- En cada iteración 'valorActual' se añade a 'acumulador'
- Cada nuevo valor ingresa a 'acumulador'
y espera la siguiente iteración. 
*/

/* OJO en el callback: primero es el acumulador 
-cuyo valor deberá ser actualizado-, luego el 
elemento del arreglo en 'valorActual' */

// Ambos valores se fusional para ser un solo valor
const suma = numeros.reduce((acumulador, valorActual) => {
  return acumulador + valorActual;
/* Cero es el valor inicial para 'acumulador'. 
Es un valor opcional, pero es buena práctica dar 
ese valor inicial para asegurar que recude() funcione bien. */
}, 0);

/* SI NO SE DA EL VALOR INICIAL -en este caso, cero-, 
reduce() usará el primer elemento del arreglo como 
valor inicial. Sin embargo, ese valor no será 
siempre el que se desea.
*/

/* reduce() acumula el valor de 'acumulador'
que es la suma de todos los valores del arreglo 'numeros' */

console.log(suma); 
// 60

Así mismo, se puede usar reduce() con elementos alfanuméricos de un arreglo:

En Javascript

const palabras = ["Hola", "Edu", "!"];

/* 
- 'a' es el valor que acumula
- 'b' es el actual valor procesado
*/
const x = palabras.reduce((a, b) => {
// Devuelve unión de valores  
return a + " " + b;
});

console.log(x); 
// Hola Edu !

MÉTODO REDUCERIGHT()

Similar al método reduce() -revisado más arriba-. Pero el método reduceRight() 'lee' los elementos del arreglo de derecha a izquierda. Ambos métodos -reduce() y reduceRight() usa la intervención de una función para alterar sus elementos.

ARGUMENTOS DE REDUCE() y REDUCERIGHT()

  • reduce() y reduceRight() usan como argumento un llamado de función que puede alterar los valores del arreglo pedido.
  • Así mismo, es opcional un valor inicial que funcional como acumulador.

ARGUMENTOS DE LA FUNCIÓN DE RETORNO -callBack-

  • Argumento como acumulador que da el valor inicial al valor a procesar
  • Argumento en el papel de actual elemento de arreglo procesado
  • Argumento en el papel de índice del actual elemento
  • Argumento en el papel del contenido del arreglo que se está analizando

En Javascript

const arr = ["primero", "medio", "ultimo"];
 /* Esta vez, el acumulador OBTIENE el ÚLTIMO 
elemento del arreglo */
 /* El acumulador reactualiza su valor 
con un nuevo dato para cada bucle */
const resultado = arr.reduceRight(
(accumulator, currentValue) => {
  return accumulator + " " + currentValue;
});

// Resulta en string concatenados
console.log(resultado); 
// ultimo medio primero

Ya que el resultado es un string -y NO un arreglo- no puedo separar los elementos mediante coma desde el método join(). Pero si deseamos usarlo, deberíamos aplicar en la invocación final a split() para separar los strings entre comas, y join() para eliminar los [...]

En Javascript

 // Arreglo
const arr = ["primero", "medio", "ultimo"];
// Aloja proceso de cada elemento
const res = arr.reduceRight((acumula, elemActual) => {
   return  acumula + " " + elemActual;
});

/* Aquí es donde que CADA STRING obtenido 
tenga separación mediante coma */
console.log(res.split(' ').join(', '));
// ultimo, medio, primero

/* Si usamos solo split, solo 
se mostrarán también los [...] */
console.log(res.split(' '));
[ 'ultimo', 'medio', 'primero' ]

MÉTODO SLICE()

Este método de arreglo 'corta y obtiene' desde un inicio hacia un final una porción de elementos dentro de un arreglo. Se resalta que slice() no altera la longitud del arreglo. Recordar: un arreglo tiene elementos posicionados mediante índices desde del cero en adelante.

En Javascript

//                 Extraer
//            |–––––––––––––––|
const cosas = ['elem0', 'elem1', 'elem2'];

// Extraer desde el indice 0 hasta el indice 2
// OJO: el ÚLTIMO elemento del último índice no se muestra
const extraer = cosas.slice(0, 2);

// join() para mostrar solo el elemento
console.log(extraer.join());
// elem0, elem1

Según el ejemplo de arriba, ¿Por qué no se extrae también el valor 'elem2', si pedimos cortar desde el índice 0 hasta el 2?. Es porque el último elemento del último índice no es mostrado.

CONTAR VS UBICAR NO ES LO MISMO

En programación hay mucha diferencia entre contar y ubicar los elementos de un arreglo. RECORDAR: Se cuentan los elementos desde el número uno en adelante, pero se ubican los elementos desde el ÍNDICE CERO en adelante.



Si tenemos un arreglo de tres elementos el conteo de la ubicación de cada elemento será a partir del índice cero en adelante. Si se pide slice(0, 1) para un arreglo de cuatro elementos, la extracción se delimitará entre los índices –de los elementos– 0 y 1.

  • [ 0xxxx, 1xxxx, 2xxxx, 3xxxx ]
  • | ---- | se extrae

Pero si se pide slice(0, 2), la extracción del dato se delimitará entre los elementos ubicados entre los índices 0 y 2:.

  • [ 0xxxx, 1xxxx, 2xxxx, 3xxxx ]
  • | ----------- | se extrae

Tomar cuenta que, a diferencia del último índice dado –que se excluye de ser extraído, el primer índice dado sí lo tomará en cuenta.

En Javascript

var arreglo = [0,1,2,3];

// Cortar y obtener desde el índice 1 en adelante
console.log(arreglo.slice(1));
// --> [ 1, 2, 3 ]

En otras palabras, JS cuenta los elementos de un arreglo desde el número uno, pero los ubica desde el índice cero en adelante. Por lo que slice() tomará en cuenta solo el índice para seleccionar desde dónde a dónde cortar.

Finalmente, con slice(), "Cuando no se proporcione el índice final, slice tomará todos los elementos después del índice de inicio" y omitir el índice de inicio copia todo el array[1].

const cosas = ['cosa0', 'cosa1', 'cosa2'];

// Solo un índice
const desdeEnAdelante = cosas.slice(2);
console.log(desdeEnAdelante);
// [ 'cosa1', 'cosa2' ]

// Sin índice
const copiaTodo = cosas.slice();
console.log(copiaTodo);
// [ 'cosa0', 'cosa1', 'cosa2' ]

SLICE() COMO MÉTODO INTEGRADO EN TIPOS PRIMITIVOS

Ya hemos dicho que el contenido de los valores no es modificable. Sin embargo, en JS todos los valores primitivos integran métodos que funcionan como manipuladores para un nuevo resultado, pero sin modificar la referencia original. Similar al uso de una fotocopiadora: obtendremos una copia de una imagen y podremos manipular esa copia, pero no el original.

En Javascript

// Valor original
var frase = "Guayaquil de mis amores";

// De inicio al final
// Mostrar solo la primera palabra
console.log(frase.slice(0, 8));
// --> Guayaquil

// Pero el string original sigue intacto
console.log(frase);
// --> Guayaquil de mis amores

// De final hacia delante
// Mostrar solo la última palabra
console.log(frase.slice(-6));
// --> amores

// Y el string original sigue intacto
console.log(frase);
// --> Guayaquil de mis amores

MÉTODO TOLOCALESTRING()

El método toLocaleString() devuelve un string con cada elemento del arreglo con alguna alteración. Es útil cuando se necesita mostrar datos con algún tipo de formato, como moneda local:

En Javascript

// Arreglo
const cost = [10, 20, 30];
// Aloja formato con estilo dólar y decimales
// Se especifica el simbolo de la moneda local 'en-US'
const dolar = cost.toLocaleString('en-US', 

/* Opciones que el método toLocaleString() 
facilita para el formateo de datos */
{ style: 'currency', currency: 'USD' });

console.log(dolar); 
// $10.00,$20.00,$30.00

Ojito con las opciones de formato para los datos obtenidos por toLocaleString():

OPCIONES DE FORMATO

  • { style:.. posibles valores son 'decimal', 'currency', 'percent'
  • { currency:.. posibles valores son 'USD', 'EUR', 'JPY'
  • { minimumIntegerDigits:.. mínima cantidad de dígitos antes del punto decimal
  • { minimumFractionDigits:.. mínima cantidad de dígitos después del punto decimal
  • { maximumFractionDigits:.. máximos dígitos después del punto decimal. Si el número tiene más dígitos estos serán redondeados.
  • xxxx

Finalmente, toLocaleString() puede ser usado con elementos alfanuméricos -palabras, números y palabras- para ser mostrados como elementos string:

En Javascript

// Arreglo
let banda = ["bajo", "batería", "guitarra"];
let result = banda.toLocaleString();b
console.log(result);
// bajo,batería,guitarra

MÉTODO CONCAT()

Este método une dos o más arreglos en uno solo. No altera ninguno de los arreglos referenciados, pero concat() genera un nuevo arreglo a partir de esas referencia.

En Javascript

// ** Uniendo dos arreglos
const saludo = ["Hola! que tal,"];
const nombre = ["Dudú"];
// Genera nuevo arreglo
const completo = saludo.concat(nombre);
console.log(completo);
// --> [ 'Hola! que tal,', 'Dudú' ]

// OTRO EJEMPLO **

// ** Uniendo tres arreglos
const saludo = ["Hola!, soy"];
const nombre = ["Dudú. Vivo en "];
const ciudad = ["Guayaquil"]
// Genera nuevo arreglo
const completo = saludo.concat(nombre, ciudad);
console.log(completo);
// --> [ 'Hola!, soy', 'Dudú. Vivo en ', 'Guayaquil' ]

concat() permite juntar arreglos anidados insertos explícitamente como argumentos en concat():

En Javascript

// primer arreglo
const a = [1, 2, 3];
// segundo arreglo
const b = [4, 5, 6];
// nuevo arreglo : 
/* Aloja en 'c' la unión del arreglo 'a' junto con 'b', 
junto con los valores '7, 8, 9,' junto con un el arreglo anidado
[10, [11, 12]] */
const c = a.concat(b, 7, 8, 9, [10, [11, 12]]);

// resultado
console.log(c); 
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, [11, 12]]

concat() También permite unir valores sueltos hacia un arreglo. Nuevamente, ese método no altera los arreglos referenciados. Simplemente toma sus elementos y los 'pega' entre sí.

const a = ["Enero", 10];
const b = a.concat("Febrero", [2022, 2023]);
console.log(b);
// [ 'Enero', 10, 'Febrero', 2022, 2023 ]

concat()También se pueden 'pegar' juntos valores de arreglos anidados –llaves dentro de llaves-:

const a = [ [ 1,2, [10,20] ] ];
const b = [3,4, [5,6]];
const x = a.concat(b);
console.log(x);

Finalmente concat() permite usar arreglos como argumentos de funciones, 'cortarlos' y unirlos para crear uno nuevo.

En Javascript

// Función con dos argumentos
function remover(array, indice) {

/* Devuelve el primer argumento */
/* Corta el array desde la ubicación cero 
hasta el valor que se haya ingresado */
return array.slice(0, indice) /*...sigue */

/* Luego, 'une' a ese resultado un nuevo arreglo: 
con el valor indice' sumado con 1 */
.concat(array.slice(indice + 1));
 } // Fin remover()

// Aloja invocación de función + argumentos
// + El primer argumento: un array
// * El segundo: el 2
var resultado = remover( ["a", "b", "c", "d", "e", "f"], 2); 

// Muestra: cortar desde 0 hasta 3
console.log(resultado);
// [ 'a', 'b', 'd', 'e', 'f' ]

MÉTODO SPLICE()

Si el método slice() no altera los elementos de un arreglo, el método splice() sí lo hace. Primero, este devuelve un arreglo de elementos borrados; o un arreglo vacio si no hay elementos en el arreglo. Segundo: inserta nuevos elementos en el arreglo.

En Javascript

var arr = [0,1,2,3,4];
// Quitar desde el índice 3 en adelante
var quitar = arr.splice(3);
// Se va 3, 4..

// Mostrar lo quitado
console.log(quitar);
// --> [ 3, 4 ]

// Muestra el arreglo alterado
console.log(arr);
// --> [ 0, 1, 2 ]

Un segundo argumento dado a splice()(ejemplo abajo) indica cuántos elementos en adelante deben ser quitados.

var arr = [0,1,2,3,4,5,6,7,8,9];

/* Quitar desde el índice 3, 
SOLO DOS elementos hacia adelante */
var quitar = arr.splice(3, 2);

// Mostrar lo quitado
console.log(quitar);
// --> [ 3, 4 ]

// Muestra el arreglo alterado
console.log(arr);
// --> [0, 1, 2, 5, 6, 7, 8, 9]
/* Al arreglo le faltan 
los dos valores mostrados */

Así mismo, nuevos argumentos dados a splice() reemplazan los elementos eliminados del arreglo.

var arr = [0,1,2,3,4,5,6,7,8,9];

/* Quitar desde el índice 3, 
SOLO DOS elementos hacia adelante. */
/* Y además, agregar DESDE lo quitado 
dos nuevos strings */
var quitar = arr.splice(3, 2, "Aqui..", "estoy..");

// Mostrar lo quitado
console.log(quitar);
// --> [ 3, 4 ]

// Muestra el arreglo alterado
console.log(arr);
/* [ 0, 1, 2, 'Aqui', 'estoy..', 5, 6, 7, 8, 9 ]*/

De igual forma, splice() también funciona como intercalador de valores cuando se le da un argumento cero:

var frase = ["Hola, ", "soy " + "Dudú"];

/* Desde el índice 1, no quitar nada. Agregar strings*/
var quitarYponer = frase.splice(1,0,
["Buenos ","días!"], "Qué tal");

// Muestra lo que se quitó (nada)
console.log(quitarYponer);
// --> []

console.log(frase);
// [ 'Hola, ', [ 'Buenos ', 'días!' ], 'Qué tal', 'soy Dudú' ]

En el ejemplo de abajo, para insertar nuevos elementos con splice(), primero desde dos argumentos -posición y cantidad de elementos a borrar-; luego, los argumentos alfanuméricos restantes son las palabras a insertar.

En Javascript

 // Arreglo de índices
var arr = ["Guayaquil"];
/* SPLICE()
Inserta dos elementos 'A' y 'B' 
a partir desde el índice 1, 
sin eliminar nada*/
arr.splice(1,0, "de", "mis", "amores");
// Muestra todo
console.table(arr);
/* 
┌─────────┬─────────────┐
│ (index) │   Values    │
├─────────┼─────────────┤
│    0    │ 'Guayaquil' │
│    1    │    'de'     │
│    2    │    'mis'    │
│    3    │  'amores'   │
└─────────┴─────────────┘
*/

MÉTODO FILL()

Al igual que splice(), fill() altera el arreglo referenciado rellenándolo según parámetros ingresados.

En Javascript

/*  Se aloja un arreglo con 
el constuctor 'new' con 5 elementos */
var a = new Array(5);

// Rellene todo el arreglo con letra 'o'
console.log( a.fill("o") );
// --> [ 'o', 'o', 'o', 'o', 'o' ]

/* Rellene con 'x' pero inicie el 
relleno desde el indice 1 */
console.log( a.fill("x",1) );
// --> [ 'o', 'x', 'x', 'x', 'x' ]

/*  Rellene con 'A' desde 
los indices 2 a hasta el 
penúltimo índice */
console.log( a.fill("A",2,-1) );
// [ 'o', 'x', 'A', 'A', 'x' ]

Un uso útil de fill() podría ser el de generar datos según porcentajes:

En Javascript

// Barras con porcentajes
// función con dos argumentos
function barra(nombre, porcentaje) {

/* 'longitud' aloja el argumento numérico ingresado
// El argumento numérico será el porcentaje que deseamos mostrar
// Divido para 10, porque solo limitaremos 
el rango de los '*' en 10 */
  const longitud = Math.round(porcentaje / 10);

/* bar' aloja un arreglo con la longitud 
dada por el cálculo 'longitud'. Luego, llena con 
'*' sin separación */
  const bar = new Array(longitud).fill('*').join('');

// Aloja el argumento numérico dado junto con el signo '%'
  const porcentajeString = `${porcentaje}%`;

/* OJO ESTE USO DE LAS PLANTILLAS LITERALES (!)
Devuelve argumento 'nombre', el nuevo arreglo 
en 'bar' y el porcentaje. */
  return `${nombre} ${bar} ${porcentajeString}`;
}

// Example usage
console.log(barra("ValorA", 26));  
console.log(barra("ValorB", 65));  
console.log(barra("ValorC", 85));  

/*
ValorA *** 26%
ValorB ******* 65%
ValorC ********* 85%
*/

Finalmente, un ejemplo similar al anterior; pero con un método para ordenar los valores:

En Javascript

// Función con dos parámetros
function crearBarras(item, porcentaje) {
// Aloja porcentaje divido para la cantidad de asteriscos
const longitudBarra = Math.round(porcentaje / 10);

/* Aloja nuevo arreglo con la cantidad de '*' 
según el argumento ingresado y separado mediante 'join'*/
const bar = new Array(longitudBarra).fill('* ').join('');

// Aloja argumento ingresado con signo '%'
const porcentajeString = `${porcentaje}%`; 

// Devuelve argumentos, barra y... una propiedad.
/* SÍ. la propiedad 'propiedadBarraString' con el valor 
de la plantilla literal `${item}... */
return { item, porcentaje, 
propiedadBarraString: `${item} ${bar} ${porcentajeString}` };
}

/* Agregamos en un arreglo las INVOCACIONES 
de la función y sus argumentos. Sí, un arreglo también 
puede alojar invocaciones de funciones */
const lasBarras = [
crearBarras("Candidato A", 100),
crearBarras("Candidato B", 15),
crearBarras("Candidato C", 80),
crearBarras("Candidato D", 8)
];

/* Al arreglo 'lasBarras' le accedemos sort() y creamos una 
función comparadora. Dos argumentos 'a, b' y comparamos 
que cada elemento sea menor al siguiente */
lasBarras.sort((a, b) => a.porcentaje - b.porcentaje);
/* Si de mayor a menor, invertir argumentos*/

/* Luego, por cada elemento del arreglo -es decir, 
por cada barra- muestre la propiedad 'propiedadBarraString'  */
// Output each bar string in the sorted order
lasBarras.forEach(bar => console.log(bar.propiedadBarraString));

/* 
Candidato D *  8%
Candidato B * *  15%
Candidato C * * * * * * * *  80%
Candidato A * * * * * * * * * *  100%
*/

MÉTODO COPYWITHIN()

Para ChatGPT: "copyWithin() es un método de matriz que permite copiar una parte de una matriz a otra ubicación dentro de la misma matriz, sobrescribiendo -borrando- los elementos existentes en el proceso". El arreglo original es alterado.

En Javascript

const frase = [2.50, "Vendo", "guatita", ];
// [2.50, "Vendo", "guatita", ]

// Copiar en el primer índice el valor desde 1 a 2
frase.copyWithin(0, 1, 2);

console.log(frase);  
/* El valor 2.50 fue reemplazado por 'vendo' */
// [ 'Vendo', 'Vendo', 'guatita' ]

Tomar en cuenta al momento de invocar arreglos:

  • Agregar un string al llamado de un arreglo elimina los [..., ...]
  • Ej.: console.log(" " + arreglo);

En otro ejemplo:

En Javascript

// Orden inicial del arreglo 
var arreglo = ['a','b','x','y','casa','gato'];
console.log("El orden inicial fue " + arreglo);
// El orden inicial fue a,b,x,y,casa,gato

/* Desde la ubicación del indice cero insertar 
los elementos ubicados desde el índice 3 hasta 4 */
console.log("Ahora el orden es " + arreglo.copyWithin(0, 3, 4));
// Ahora el orden es y,b,x,y,casa,gato

// El arreglo original FUE ALTERADO
console.log(arreglo);
// [ 'y', 'b', 'x', 'y', 'casa', 'gato' ]

En otros ejemplos:

En Javascript

// Arreglo
var arregloFrase = ['Guayaquil', 'de', 'mis'];

/* En el índice cero, COPIAR allí 
todo lo que se halle entre los índices 3 a 4 */
var cambioA =  arregloFrase.copyWithin(1, 0, 2);
console.log(cambioA);
// [ 'Guayaquil', 'Guayaquil', 'de' ]
// El arreglo 'arregloFrase' ha sido alterado 

// + + + 

/* En el último índice COPIAR todo lo que 
se halle entre los índices 0 a 1 */
var cambioB =  arregloFrase.copyWithin(-1, 0, 1);
console.log(cambioB);
// [ 'Guayaquil', 'Guayaquil', 'Guayaquil' ]

// Otro ejemplo:
const letrasA = ["A", "B", "C", "D"];
/* Copiar en el indice cero lo que se halle en el indice 3 */ 
let mostrarA = letrasA.copyWithin(0, 3);
console.log(mostrarA);
// [ 'D', 'B', 'C', 'D' ]

/* Copiar al indice 2 lo que se halle entre indice 0 y 2 */
const letrasB = ["A", "B", "C", "D", "D", "E"];
let mostrarB = letrasA.copyWithin(1, 2, 3);
console.log(mostrarB);
// [ 'D', 'C', 'C', 'D' ]

Finalmente, si no se especifica el último índice en los parámetros del método –es decir, si solo se piden dos valores y no tres– se copiarán los elementos desde el primer índice en adelante. Hasta la fecha de hoy esté método no funciona para navegadores Internet Explorer 11 y anteriores.

En Javascript

const frase = ["A", "B", "C", "D" ];

// Solo se da un argumento de indice
/* Copia en el indice 1 sobreescribirá 
los elementos que inician en indice 1 */
frase.copyWithin(1);

console.log(frase);  
// [ 'A', 'A', 'B', 'C' ]

MÉTODO FINDINDEX()

Retorna un índice de elemento de un array siempre que cumpla una condición desde 'findIndex (...condicion...)'. Devuelve -1 si no la cumple. Recordar:

En Javascript

const nums = [1, 2, 3, 4, 5];
/* Aloja búsqueda del índice 
de un elemento que sea IGUAL a 3 */
const indiceHallado = nums.findIndex(item => item === 3);
console.log(indiceHallado); 
// 2

En otro ejemplo se busca el primer índice de un elemento de arreglo que finalice con un caracter dado en condición:

En Javascript

// Arreglo
const arr = ['Julio', 'Julia'];

// Hallar elemento que finalice con la letra 'a'
/* OJO COMO EL ELEMENTO ITEM DEBE ACCEDER 
AL MÉTODO CHARAT PARA ASÍ, LOGRAR OBTENER EL CARACTER */
const x = arr.findIndex(
item => item.charAt(item.length - 1) === 'a');
console.log(x); 
// 1

// Luego, podemos llamar al elemento según el índice dado
console.log(arr[1]);
// Julia

MÉTODO JOIN()

Junta los elementos de un arreglo con un separador alfanumérico dado en parámetro. Aún así, la longitud del arreglo arreglo.length no es alterada.

En Javascript

// Arreglo con cuatro elementos
const elements = ['Guayaquil', 'de', 
'mis', 'amores'];

/* Sin unión. Separación standart 
mediante ',' cuando se omite 
elemento de separación */
console.log(elements.join());
// Guayaquil,de,mis,amores

// Unir sin ningún elemento
console.log(elements.join(''));
// Guayaquildemisamores

// Unir con guión
console.log(elements.join(' ** '));
// Guayaquil ** de ** mis ** amores

// Unir con comas
console.log(elements.join(', '));
// Guayaquil, de, mis, amores

/* El arreglo referenciado sigue 
teniendo cuatro elementos */
console.log(elements.length);
// 4

Y para mostrar el último elemento de todo arreglo, la sintaxis es: nombreArreglo [nombreArreglo.length-1]

 //Arreglo con dos elementos
const elements = ['primero', 'final'];
// Mostrar el último
console.log(elements[elements.length-1]);
// --> final

MÉTODO EVERY()

Evalua el cumplimiento de una condición en todos los elementos del arreglo:

En Javascript

// Arreglo
const numbers = [15, 20, 25, 30];
/* Aloja evaluación: si cada item es mayor a 10 */
const eval = numbers.every((item) => item > 10);
/* Si todos los elementos son mayores a 10, da TRUE */
// Sino, da FALSE
console.log(eval); 
// true

En otro ejemplo:

En Javascript

 // Arreglo
let palab = ['panita', 30];

function detectar(){
/* Detectar si el elemento con índice 
cero corresponde a la palabra 'panita'*/
return palab[0] == "panita";
}

console.log(palab.every(detectar));
//-> True

En otro ejemplo, la evaluación se la hace retornando desde la función al parámetro 'elemento' de la función 'detectar():

let palab = [true, true, false];

function detectar(elemento){
/* Detectar si TODOS LOS ELEMENTOS 
del arreglo tienen valor booleano 'true' */
// Retornamos parámetro 'elemento'
return elemento == true;
}

/* Invocamos arreglo, método every() y función */
console.log(palab.every(detectar));
//-> False. 

MÉTODO REPEAT()

Sencillo método que repite valores según cantidad dada en argumento.

var frase= "Gringa loca," + "\n" ;

// Repite 3 veces
var coro = frase.repeat(3);
/* 
Gringa loca...
Gringa loca...
Gringa loca... 
*/

var sigue = "Fuiste tú la que se quiso casar..."
console.log(coro + "\n" + sigue);
// Valor referenciado desde 'frase' no se altera

MÉTODO SORT() y REVERSE()

Ordena de forma ascendente –o también descendente– lo valores de un arreglo. Con reverse() resulta en un orden inverso.

const dias = [9, 20, 1000];

/* Ordena y altera el arreglo 
–de mayor a menor– */
console.log(dias.sort());
// --> [ 1000, 20, 9 ]

// Para ordenar de menor a mayor
/* Debe comparar dos valores. 
Luego, devolver de menor a mayor */
function ordenarInverso(a, b) {
  return a - b;
}

// Uso de nombre de función como argumento
console.log( dias.sort(ordenarInverso) );
// --> [ 9, 20, 1000 ]

// ** CON REVERSE() **
console.log(dias.reverse());
// --> 1000, 20, 9 

MÉTODO SOME()

Evalúa si cada uno o al menos uno de los elementos de un arreglo cumple una condición dada callback. No altera el arreglo inicial y no evalúa elementos sin valor. some()siempre requerirá de una función para recorrer un arreglo. Devolverá booleanos: true si alguno de los elementos –no mostrará el elemento– da true en la condición.

En Javascript

// Arreglo
const numbers = [5, 10, 15, 20];
/* Aloja condición: si todos o alguno 
de los elementos cumple la condición */
const eval = numbers.some((number) => number > 10);

// Si condición se cumple: TRUE
console.log(eval); 
// true

En otro ejemplo:

// Arreglo
const edad = [5, 10, 15, 20];

/* Se crea función 'revisar' 
con el arreglo 'edad' como argumento */
function revisar(edad) {
  return edad > 19;
}

/* ¿Hay algún valor en 'edad' por encima de 19? */
console.log(edad.some(revisar));
// True

En otro ejemplo se evalua si existe dentro de los elementos del arreglo algún elemento mayor a 10:

function evaluar(element) {
  return element > 10;
}

// Dentro del arreglo existe un número mayor a 10?
console.log( [1, 2, 3, 4, 15].some(evaluar) );
// TRUE

Para determinar si un elemento está presente en un arreglo dado:

const apellidos = ["Romero", "Ugalde", "Ramirez"];

// Función con parámetros
/* nombreArreglo recibirá el nombre del arreglo */
/* valorElemento recibirá el string a evaluar */
function buscar(nombreArreglo, valorElemento) {
/* Devuelve el nombre del arreglo pero activando 
la función evaluadora some() */
return nombreArreglo.some((loquesea) => 
/* Condición: que valorElemento sea igual al 
argumento string en la invocación final */
valorElemento === loquesea);
}

console.log( buscar(apellidos, "ugalde")); 
/* False. 
El valor existente en el arreglo 
tiene la U en mayúscula */

En un ejemplo final, se busca hallar si habrá algún número que de residuo mayor a cero al dividirlo para 2:

const array = [10, 2, 3];

/* Hallar si existe residuo mayor a cero al dividir 
2 con cada elemento del arreglo  */
console.log(array.some(data => data % 2));
// Análisis:
// 10 / 2 = no hay residuo
// 2 / 2 = no hay residuos
// 3 / 2 = SÍ hay residuo

// El algoritmo devolverá TRUE
/* Es decir, al menos un número 
dividido para 2 da un residuo mayor 
a cero */

MÉTODO FIND()

Evalua la presencia del PRIMER elemento que ha cumplido una condición de coincidencia dentro de un arreglo. Si no halla la búsqueda determinada, devolverá 'undefined'. Por lo tanto, find() contiene la función anónima con la condición a evaluar.

MÉTODO STRING()

Si bien no es un método nativo del objeto Array, string() es útil para una simple conversión de elementos de arreglo a dato string, además de separarlos con coma.

En Javascript


const arr = [1, 2, 3];
const arrString = arr.toString();

/* Genera un solo string a partir 
de los elementos del arreglo */
console.log(arrString); 
// "1,2,3"

// - - - 

const saludo = ["Holi", " amiwwis"];
const arrSaludo = saludo.toString();

/* Genera un solo string a partir 
de los elementos del arreglo */
console.log(arrSaludo); 
// Holi, amiwwis

En Javascript

// Se crea arreglo con objetos
const personal = [
// Propiedades y valores
  { nombre: 'Alice', edad: 27 },
// Solo obtiene el primer 'Willy'
  { nombre: 'Willy', edad: 32 },
  { nombre: 'Willy', edad: 97 },
  { nombre: 'Dave', edad: 24 },
];

/* Aloja búsqueda: alguna propiedad 
'nombre' que coincida con 'Willy' */
const hallar = 
personal.find((item) => 
item.nombre === 'Willy');

console.log(hallar); 
// { nombre: 'Willy', edad: 32 }

En otro ejemplo:

En Javascript

// Arreglo
let ciudad = ["GYE", "Uio", "Esm"];
// Se guarda búsqueda 
let buscar = ciudad.find(function(val) {
// Se determina si es minúscula o mayúscula
return val === "Gye" || val === "GYE"});
// Mostrar valor hallado
console.log(buscar);
// GYE

MÉTODO OBJECT.KEYS ()

Es una función cuyo resultado será un arreglo. No es un método dirigido a arreglos, pero es usado para retornar las propiedades de un objeto en forma strings, y agrupado en arreglo. El orden de las propiedades se regirán según el orden ya dado en el objeto.

En Javascript

 // Objeto con propiedades y valores
const humano = {
  nombre: 'Dudu',
  edad: 41,
  ciudad: 'Guayaquil'
};

// Aloja solo las propiedades del objeto
const claves = Object.keys(humano);
// Muestra
console.log(claves); 
// [ 'nombre', 'edad', 'ciudad' ]

// Muestra sin los brackets
console.log(claves.join(', ')); 
// nombre, edad, ciudad

Así mismo, obtiene solo los índices de cada elemento de un arreglo:

En Javascript

// Arreglo
const humano = ["Hola", "Edu", "Romero"]

// Obtiene solo los índices de cada elemento
const claves = Object.keys(humano);
// Muestra
console.log(claves); 
// [ '0', '1', '2' ]

MÉTODO FOREACH()

Este método permite una acción para cada elemento de un arreglo. Para Svekis y Putten[5] forEach() podría comportarse como un bucle, pero además de iterar sin interrupciones, ejecuta una alteración definida en cada elemento iterado.

En Javascript

// Arreglo
const numbers = [1, 2, 3, 4, 5];
// Se accede a forEach()
// Por cada item, mostrar item
numbers.forEach(item => {
console.log(item);
});

En otro ejemplo se accede y se muestran solo los items de las propiedades de los elementos objeto del arreglo. Recordemos que un objeto contiene datos duales de {propiedad:'valor'}. Y recordar también que un arreglo puede contener datos objetos como en el siguiente ejemplo:

En Javascript

// Arreglo con datos objetos
const banda = [
{ nombre: "Paul", edad: 30, instrumento: "bajo" },
{ nombre: "Ringo", edad: 25, instrumento: "bateria" },
{ nombre: "John", edad: 35, instrumento: "voz" }
];

// Acción para cada elemento 'a' del arreglo 'banda'
banda.forEach(a => {
// Por cada elemento de arreglo,
// se invoca a cada elemento del arreglo desde ForEach,
// y a las propiedades del objeto del arreglo.
console.log(
`${a.nombre} tiene ${a.edad} y usa ${a.instrumento}.`);
});
/*
Paul tiene 30 y usa bajo.
Ringo tiene 25 y usa bateria.
John tiene 35 y usa voz.
*/

En el ejemplo de abajo sucede algo especial: forEach() invoca como argumento a una función de retorno o 'callBack'. Y es solo esa función -y no forEach()- quién presenta dos parámetros '(elemento, indice)'. Donde 'elemento' apunta a cada elemento del arreglo procesándose, e 'índice' apunta al valor de ubicación de ese elemento.

Pero, ¿por qué forEach() llama a dos parámetros?. Es por que solo la función de retorno puede leer hasta tres parámetros en este estricto orden: el elemento de arreglo a procesar, el índice del elemento procesado y el contenido del arreglo que la función callback activa al ser llamada por forEach(). En general, los tres parámetros que podrían ser usados por el callback llamado desde forEach() son:

En Javascript

array.forEach(
elementoDelArray, 
indiceDelArray, 
contenidoDelArreglo){}...

CUIDADO

  • forEach() no usa tres parámetros. SOLO usa uno, que es el nombre identificador de la función callback.
  • Solo la función callback es la que sí puede usar hasta tres de los parámetros explicados más arriba.

Sin embargo, el segundo y el tercer parámetro son opcionales al momento de usar forEach(). Puesto que si no se necesita el índice del array o el contenido del array en la función de retorno, ambos parámetros no serán de utilidad.

Por lo tanto, cuando forEach() presente solo un parámetro, ese parámetro representará solamente el elemento -del arreglo- procesándose, y no al índice o al contenido del arreglo en sí.

En Javascript

// Arreglo
let geometricos = ["cubo", "rectangulo", "circulo"];

/* Ojo: separamos con comas y no con signo '+' */
/* Función 'mostrar' con parámetros: elemento e indice*/
function mostrar(elemento, indice){
/* Método de la función: ojo como 
llama a los parámetros de 'mostrar'*/
console.log("Mostrar", elemento, 
"en ubicación ", indice)
}

/* Esta invocación llama a la función 'mostrar', 
que a su vez es argumento de la función forEach()*/
geometricos.forEach(mostrar);
/* ->
Mostrar cubo en ubicación  0
Mostrar rectangulo en ubicación  1
Mostrar circulo en ubicación  2
*/

Entonces, ¿cómo sería un ejemplo de la función de retorno llamada por forEach() usando los tres parámetros (elemento, indiceArreglo, arreglo)?. ChatGPT da una muestra:

En Javascript

// Array
const num = ["cero", "uno", "dos"];
/* Los tres parámetros de forEach() */
num.forEach((elemento, indice, arreglo) => {
// Ojo el uso de plantillas literales 
console.log(`Elemento ${elemento} es indice ${indice} 
en arreglo [${arreglo}].` + "\n");
});

/*
Elemento cero es indice 0 
en arreglo [cero,uno,dos].

Elemento uno es indice 1 
en arreglo [cero,uno,dos].

Elemento dos es indice 2 
en arreglo [cero,uno,dos].

[Finished in 66ms]
*/

En otro ejemplo, forEach() agrega solo un valor –el del elemento del arreglo– al único parámetro de la función que mostrará las frases:

En Javascript

// Arreglo
let ideas = ["sol", "encebollado", "salsa"];

function recorre(cadaElemento){
console.log("Guayaquil es...", cadaElemento);
}
ideas.forEach(recorre);
/* 
Guayaquil es... sol
Guayaquil es... encebollado
Guayaquil es... salsa
*/

DIFERENCIA ENTRE FOREACH() Y UN BUCLE

Para Svekis y Putten[5] forEach() no interrumpe la iteración –como sí lo hace un bucle como if/else cuando una condición sea 'false'–. En otras palabras, forEach() recorre y toma los valores de contenido y ubicación de al menos tres elementos -en caso de usarlos todos-: del elemento del arreglo, del índice y del contenido del arreglo. Los obtendrá sin cumplir condición alguna, como sí lo hace un bucle. En todo caso, el uso de bucles o de forEach() dependerá de las necesidades de iteración y de utilidad.

MÉTODO FILTER()

Obtiene aquellos elementos del arreglo que han aprobado una condicional. En otras palabras, filter() crea un nuevo arreglo con los elementos del arreglo que cumplen una condición dada por la función de retorno o callback.

En Javascript

let num = [10, 20, 120, 240, 380];

function recorrer(elemento){
/* Extraer solo los números mayores a 100 */
return elemento > 100;
}

/* 
- Invoca función de retorno.
- recorrer() activa condición 
- Solo los elementos que han pasado 
la condición se obtienen
*/
console.log( num.filter(recorrer) );
//-> [ 120, 240, 380 ]

En otro ejemplo, una función 'recorrer' devolverá un elemento solo si hay igualdad. Si filter() no haya el elemento, devolverá un arreglo vacío [ ].

En Javascript

// Arreglo
let jerga = ["pana", "yuntita", "amiwi"];

/* Función con parámetros 'elemento' e 'indice' */
function recorrer(elemento, indice){
/* Condición */
return elemento == "yuntita";
}

/* Función callback 'recorrer' */
/* Guarda la iteración */
let usoFilter = jerga.filter(recorrer);

// Muestra
console.log(usoFilter);
//-> [ 'yuntita' ]

Es decir, forEach() permite devolver un nuevo arreglo conteniendo los elementos 'filtrados' obtenidos según la evaluación dada por el método. Sin embargo, el arreglo original está inalterado.

En Javascript

// Arreglo
let palab = ['panita', 'yuntita', 'hermano'];

/* Ojo como filter() contiene 
como argumento una función flecha */
let filtrado = palab.filter(

/* Detectar solo las palabras que contengan las letras 'ita'*/
palab => palab.includes("ita")
);

console.log(filtrado);
//-> [ 'panita', 'yuntita' ]

// El arreglo sigue tal cual
console.log(palab);
// [ 'panita', 'yuntita', 'hermano' ]

Un peque ejemplo más: filter() activa una función de retorno con una condición que busca números pares entre los elementos de un arreglo:

En Javascript

// Arreglo
const nums = [1, 2, 3, 4, 5];
// Aloja callback
/**/
const extraerPares = nums.filter((elemento) => {
/* Condición: Si el número dividido 
para 2 tiene residuo cero */
return elemento % 2 === 0;
});

console.log(extraerPares); 
// [2, 4]

RECORDAR SIEMPRE:

  • Es un error afirmar que métodos como forEach() o filter() pueden contener hasta tres parámetros -el elemento del arreglo, el índice y el contenido del arreglo-.
  • Esos métodos pueden usar solo un parámetro. Este es, el nombre identificador de la función callback que están llamando.
  • Solo la función callback o de retorno -que esos métodos invocan- es la que sí puede usar hasta tres parámetros en caso de necesitarlos. Aunque es común que solo se use el primer parámetro -el del elemento

Queda por estudiar los métodos para arreglos: reduceRight(), toLocaleString(), toString(), valueOf()


Subir al inicio Avanzar



BIBLIOGRAFÍA:
    3ra edición. 2018. Marijn Haverbeke. No starch press.
    Mozilla Foundation.
    David Flanagan (2020). Editorial O'Reilly.
    Ved Antani, Stoyan Stefanov (2017). Packt Publishing.
    Editorial Packt.
    Information and Computation. Elsevier.
    ACM SIGCSE BulletinVolume 19Issue