Clase 16 - Listas y Objetos en JavaScript

Listas

Vimos el tipo de datos lista (array) en JavaScript, y algunos ejemplos de código.

Definir listas

var listaDeNumeros = [1, 23, 56, 1234];
var listaDeStrings = ['a', 'abc'];
var listaDeFloats = [1.23, 2.34, 3.45];
var listaDeBooleanos = [false, false, true];
var listaDeMultiplesTipos = [1, 'a', 1.23, false];

Acceder a Valores de una lista

console.log("acceder a una posicion: ", listaDeNumeros[0]);
console.log("acceder a la longitud: ", listaDeNumeros.length);

Recorridos sobre Listas

Calcular la suma de todos los valores de una lista de números

// calcular la suma total de listaDeNumeros
var sumaTotal = 0;
for(i = 0; i < listaDeNumeros.length; i++) {
    console.log("Posición: ", i);
    console.log("Valor en posición: ", listaDeNumeros[i]);
    sumaTotal = sumaTotal + listaDeNumeros[i];
    console.log("Suma hasta el momento: ", sumaTotal);
}
console.log("Suma total: ", sumaTotal);

// calcular la suma total de listaDeNumeros (otra versión)
var sumaTotalv2 = 0;
listaDeNumeros.forEach(e => sumaTotalv2 += e)
console.log("Suma total (v2): ", sumaTotalv2);

Multiplicar todos los valores

// multiplicar todos los numeros por 5
var listaPor5 = [];
for (let i = 0; i < listaDeNumeros.length; i++) {
    // accedo al valor en posición actual y lo multiplico por 5
    var valorActual = listaDeNumeros[i];
    var resultadoPosicionActual = valorActual * 5;
    
    // modifico el valor en la lista
    listaPor5[i] = resultadoPosicionActual; 
}
console.log("lista resultado: ", listaPor5);

// multiplicar por 5
var listaPor5opcion2 = listaDeNumeros.map(e => e * 5);
console.log("lista resultado v2: ", listaPor5opcion2);

Comentario extra: Para intercambiar 2 posiciones de una lista es necesario usar una variable temporal

var temporal = nuevaLista(0);
nuevaLista[0] = nuevaLista[1];
nuevaLista[1] = temporal;

Agregar Elementos

Una opción para agregar elementos es operar con los índices directamente

// agegar un nuevo elemento al final de la lista
var nuevoValor = 42;
var nuevaPosicion = listaDeNumeros.length;
listaDeNumeros[nuevaPosicion] = nuevoValor;
console.log("lista con nuevo valor: ", listaDeNumeros);

Esta opción puede traer complicaciones, dejando listas inconsistentes al agregar o eliminar elementos

// agregar otro elemento
listaDeNumeros[99] = nuevoValor;
console.log("lista con nuevo valor en posición 99", listaDeNumeros);

// eliminar elemento de una lista
delete listaDeNumeros[99];
console.log("lista con nuevo valor eliminado", listaDeNumeros);

// en este punto la longitud de la lista quedó inconsistente
console.log(listaDeNumeros.length);

Otra opción para agregar elementos es usar los métodos push() y unshift() de listas

var nuevoValor = 33;

// agregar un elemento al final de una lista
listaDeNumeros.push(nuevoValor);

// agregar un elemento al inicio de una lista
listaDeNumeros.push(nuevoValor);

Filtrar Listas

Se puede usar el método filter() filtrar los elementos de una lista. La función de filtro que recibe filter() debe devolver true para que el elemento permanezca en la lista resultante y false para que sea eliminado de la lista resultante.

var listaDePreposiciones = ['a', 'ante', 'bajo', 'cabe', 'con', 'contra', 'de', 'desde', 'durante', 'en', 'entre', 'hacia', 'hasta', 'mediante', 'para', 'por', 'según', 'sin', 'so', 'sobre', 'tras', 'versus', 'vía'];

// me quedo con las palabras de al menos 3 letras de largo
var listaFiltrada = listaDePreposiciones.filter((elementoActual) => {
    return elementoActual.length > 3;
})
console.log("lista de preposiciones filtrada", listaFiltrada)
console.log("lista de preposiciones original", listaDePreposiciones)

Listas dentro de listas

Se pueden definir listas dentro de otras listas

var listaAnidada = [ 1, 2, 3, [7, 8, 9], 4, 5, 6 ]
listaAnidada[3][1] // accedo al 8

Objetos

Declaración y creación de Objetos

var objetoAlumno = {
    nombre: "Juan",
    apellido: "Pérez",
    "edad": 18,
    "nombre.y.apellido": "Juan Pérez II",
};

Acceder los valores dentro de los campos (atributos, claves) de un objeto

// acceso por sintáxis de punto
alumno.edad;

// acceso por sintáxis de corchetes
alumno["edad"]
alumno["nombre.y.apellido"]

// el acceso por corchetes se puede usar para acceder a campos con nombres calculados
var campoImportante = "nombre";
alumno[campoImportante]
campoImportante = "apellido";
alumno[campoImportante]

Tipos de valores dentro de los campos de un objeto

var objetoConDatosDeDistintosTipos = {
    unValorBooleano: true,
    unValorNumerico: 2,
    unValorString: "aaaaa",
    unValorLista: [],
    unValorObjeto: {},
}

Listas y Objetos

Queremos almacenar un listado de alumnos. Evaluamos distintas opciones

// la posicion indica que alumno refiere en los listados
var listadoDeNombres = ["Juan", "Sahid"]
var listadoDeApellidos = []
var listaDeEdades = [18, 19, 20]
// objeto con todos los alumnos
var objetoDeAlumnos = {
    nombre_1: "Juan",
    apellido_1: "",
    edad_1: 18,

    nombre_2: "Sahid",
    apellido_2: "",
    edad_2: 19,
}
// Un objeto para cada alumno, dentro de otro objeto.
var objetoListaAlumnos = {
    alumno_1: {
        nombre: "Juan",
        apellido: "",
        edad: 18,
    },
    alumno_2: {
        nombre: "Sahid",
        apellido: "",
        edad: 19,
    }
}
// un objeto para cada alumno, una lista para contener a todos los alumnos
var listaDeAlumnos = [
    {
        nombre: "Juan",
        apellido: "",
        edad: 18,
    },
    {
        nombre: "Sahid",
        apellido: "",
        edad: 19,
    },
]
// Agrego un nuevo alumno al listado
listaDeAlumnos[2] = {
    nombre: "Agustin",
    apellido: "",
    edad: 19,

}
console.log("Lista Nueva de Alumnos: ", listaDeAlumnos);

Creo un nuevo alumno y lo agrego al listado

// function crearNuevoAlumno(nombre, apellido, edad) {
//     return {
//         nombre,
//         apellido,
//         edad,
//     };
// }
// var nuevaListaDeAlumnos = agregarAlumno(listaDeAlumnos, datosDelAlumno);

Accediendo a valores dentro de una lista de objetos

var alumnoA = {
    nombre: "Juan",
    apellido: "",
    edad: 18,
};

var alumnoB = {
    nombre: "Sahid",
    apellido: "",
    edad: 19,
};

// creo un listado de alumnos
var listaDeAlumnosEjemplo = [
    alumnoA,
    alumnoB,
];

// accedo a campos dentro de los alumnos, dentro del listado
var nombreDelAlumno = listaDeAlumnosEjemplo[1].nombre;
var apellidoDelAlumno = listaDeAlumnosEjemplo[1].apellido;