RSS Feed

Trabajar con arreglos en javascript (parte 2)

6

diciembre 4, 2012 by - @ferrod20

Como prometí anteriormente en Trabajar con arreglos en javascript (parte 1), voy a presentar en esta oportunidad 3 útiles e interesantes métodos que posee la clase array: some, every y reduce.

Estos ejemplos que muestro a continuación (solo simplificados para que no sea tan tedioso explicarlos y entenderlos) son piezas de código genuinas que sirven para comprender la utilización de los métodos mencionados en un contexto real.

Se define la clase Usuario que posee la complejidad mínima y necesaria para exhibir los ejemplos.

Usuario es una clase trivial con 3 propiedades: id, nombre y esAdmin y el método validar que devuelve 2 errores.
Se construye el arreglo usuarios con 3 objetos de esa clase.

function Usuario(nombre, esAdmin, id){	
	this.nombre = nombre;
	this.esAdmin = esAdmin;
	this.id = id;
		
	this.validar = function (){
		return ["error1 " + nombre, "error2 " + nombre];
	};
};

var usu1 = new Usuario('Juana', false);
var usu2 = new Usuario('Pedro', false);
var usu3 = new Usuario('Alberta', true);

var usuarios = [usu1, usu2, usu3];


some

Dada una función, some devuelve verdadero si algún elemento del arreglo cumple con la misma.
El objetivo de este ejemplo es escribir el código necesario para saber si alguno de los usuarios es administrador.

Usando for:

var hayAlMenosUnAdministrador = false;
for (var i; i < usuarios.length; i++) {
	var usuario = usuarios[i];
	if (usuario.esAdmin) 
		hayAlMenosUnAdministrador = true;        
}

Usando some:

var hayAlMenosUnAdministrador = usuarios.some(function(usuario){
	return usuario.esAdmin;
})

Usando some pero más prolijo:

var esAdmin = function(usuario){
	return usuario.esAdmin;
};

var hayAlMenosUnAdministrador = usuarios.some(esAdmin);


every

Dada una función, every devuelve verdadero si todos los elementos del arreglo cumplen con la misma.
El objetivo de este ejemplo es practicamente la misma idea anterior, solo que en este caso el objetivo es saber si todos los usuarios son administradores.

var sonTodosAdmin = usuarios.every(esAdmin);


reduce

reduce aplica una función que toma como parámetros el valor acumulado y el elemento actual del arreglo. Esa función devuelve el nuevo valor acumulado. El segundo parámetro de reduce recibe el valor inicial acumulado.
El objetivo de este ejemplo es escribir el código necesario para construir un arreglo con todos los errores de validación de todos los usuarios. Recordemos que cada objeto usuario posee el método validar que devuelve los errores de validación del mismo.

Usando for:

var todosLosErrores = [];
for (var i = 0; i < usuarios.length; i++){
	var usuario = usuarios[i];
	var errores = usuario.validar();
	
	for (var e = 0; e &lt; errores.length; i++)
		todosLosErrores.push(e);
}

Mejorado:

var todosLosErrores = [];
for (var i = 0; i < usuarios.length; i++){
	var usuario = usuarios[i];
	var errores = usuario.validar();	
	todosLosErrores = todosLosErrores.concat(errores);
}

Usando reduce:

var todosLosErrores = usuarios.reduce( function(errores, usuario){
	return errores.concat(usuario.validar());
},[]);

Usando reduce pero más prolijo:

var agregarErrores = function(errores, usuario){
	return errores.concat(usuario.validar());
}
var todosLosErrores = usuarios.reduce(agregarErrores,[]);

En la tercera parte de este artículo se muestran ejemplos de los métodos: forEach, filter y map.


  • http://twitter.com/AlejoNext Alejandro Ñext

    Pero esos arreglos para que funcione, construcción de la clase debe utilizar el “this” ??

  • anonimo

    que blog de mierda

    • matiasarriola

      una **cagada**!! hay un par de sitios en español que son muy buenos, voy a tratar de hacer una recopilación.

      De todas maneras estoy seguro de que todo lo que puso la gente que participó hasta ahora, le sirvió a mucha gente!
      Abrazo

      • pjnovas

        responder a un anonimo es lo mismo q hablar con una pared

        • matiasarriola

          Solo quería dejar mi opinión sobre el tema para que también pueda ser leída por cualquier otro anon que vea este artículo, no específicamente ese anon ;)

          Y es obvio que es un comentario troll que no aporta nada; como es obvio que este sitio se mantiene a pulmón, no tiene fines de lucro, mucha gente colaboró con el simple objetivo de ayudar a la comunidad de desarrolladores de JS de habla hispana y a los futuros desarrolladores JS. Debería ser obvio también, que están las puertas abiertas para que si el blog te parece una mierda, ayudar a mejorarlo porque es de todos.

          TLDR: aguante fernetjs!

    • pjnovas

      bardear gratis como anonimo es facil y no aporta viejo.