Buenas, alguien me puede dar una mano con un ejercicio de JavaScript?

Publicado por Marianela Benítez
hace 1 año

Lo que debería hacer la lógica es, por cada elemento de la lista1, recorrer toda la lista2 buscando la coincidencia. Si no la encuentra, se guardará en una nueva lista o se mostrará por pantalla.

Yo hice lo siguiente, pero necesito que los nombres que no coincidan, se guarden en la lista_faltantes_en_lista_2, solo una vez, pero se guardan cada vez que recorren la lista 2.

let lista1 = [
    {id: 1, nombre: "Marianela"},
    {id: 2, nombre: "Marina"},
    {id: 3, nombre: "Ezequiel"},
    {id: 4, nombre: "Francisco"},
    {id: 5, nombre: "Lara"},
    {id: 6, nombre: "Lourdes"},

];

let lista2 = [
    {id: 1, nombre: 'Marianela'},
    {id: 2, nombre: 'Franco'},
    {id: 3, nombre: 'Jeremías'},
    {id: 4, nombre: 'Ezequiel'},
    {id: 5, nombre: 'Marcos'},
    {id: 6, nombre: 'Matias'},
];

var cantidad_faltantes_en_lista_2 = 0;
var lista_faltantes_en_lista_2 = [];

const faltantes_en_lista_2 = () => {

    for(var i=0;i<lista1.length;i++){
        for(var j=0;j<lista2.length;j++){
            if((lista1[i].nombre!=lista2[j].nombre)&&(lista1[i].id!=lista2[j].id)){
                cantidad_faltantes_en_lista_2 = lista1.length - coincidencias;
                lista_faltantes_en_lista_2.push(lista1[i].nombre);
            }
        }   
}
alert(`Cantidad de elementos presentes en lista uno y faltantes en lista dos: ${cantidad_faltantes_en_lista_2}`);
console.log(lista_faltantes_en_lista_2);
}
JavaScript
Respuesta de Cristian Olaz
hace 1 año

Hola Marianela,

Por empezar veo que estás comparando los ítems usando el nombre y también el id, quizá solo debas usar el nombre para evitar duplicados en el caso de que el id sea distinto para los registros de ambas listas (por ejemplo el registro de "Ezequiel").

Por otra parte, hay un problema con los ciclos for que usaste. Lo que sucede es que si tomás un ítem de la "lista1" y buscás diferencias en la lista2 todos los ítems te van a dar positivo excepto el único registro que coincida. Por ejemplo, si en el primer ciclo for tomás el registro "Marianela" de la lista1 luego en el segundo for al compararlo con la lista2 todos los ítems que no sean iguales a Marianela te van a dar como faltantes. "Franco" te va a dar como faltante, "Jeremías", etc.

Hay varias maneras de resolver el problema. Una manera puede ser inicializar una bandera al comienzo del segundo for para verificar si al completar todas las vuletas el registro de la lista1 fue encontrado en la lista2. Te muestro un ejemplo:

// Iniciailzamos una lista de registros faltantes
registros_faltantes = []

for (var i = 0; i < lista1.length; i++) {

    // Inicializas una variable que cambiará a "true" sólo si se encuentra el ítem en la lista2
    nombre_encontrado = false;

    for (var j = 0; j < lista2.length; j++) {

        // Si encontramos el ítem entonces lo marcamos como "true".
        if (lista1[i].nombre == lista2[j].nombre) {
            nombre_encontrado = true;

            // Cortamos el ciclo porque ya no es necesario seguir buscando
            break;
        }
    }

    // Si el registro no fue encontrado entonces podemos guardarlo en una lista de registros faltantes
    if (! nombre_encontrado) {
        registros_faltantes.push(lista1[i].nombre)
    }
}

console.log("Registros faltantes en la lista 2: " + registros_faltantes.length)

Si además de esto querés evitar la duplicidad en la variable "registros_faltantes" también podrías usar un "set" en lugar de una lista.

Espero haberte ayudado.

Respuesta de Nick
hace 1 año

Hola,

El problema en tu código es que estás empujando los nombres que no coinciden en la lista lista_faltantes_en_lista_2 cada vez que recorres la lista 2, lo que resulta en que los mismos nombres se agreguen varias veces a la lista.

Yo te aconsejo crear una variable booleana que se establezca en true cuando encuentres un nombre que no coincida en la lista 2 y, después de recorrer la lista 2, verificar si esa variable sigue siendo verdadera. Si lo es, significa que el nombre no coincidió con ninguno de los nombres en la lista 2 y se puede agregar a la lista de faltantes.

let lista1 = [
    {id: 1, nombre: "Marianela"},
    {id: 2, nombre: "Marina"},
    {id: 3, nombre: "Ezequiel"},
    {id: 4, nombre: "Francisco"},
    {id: 5, nombre: "Lara"},
    {id: 6, nombre: "Lourdes"},
];

let lista2 = [
    {id: 1, nombre: 'Marianela'},
    {id: 2, nombre: 'Franco'},
    {id: 3, nombre: 'Jeremías'},
    {id: 4, nombre: 'Ezequiel'},
    {id: 5, nombre: 'Marcos'},
    {id: 6, nombre: 'Matias'},
];

var cantidad_faltantes_en_lista_2 = 0;
var lista_faltantes_en_lista_2 = [];

const faltantes_en_lista_2 = () => {

    for(var i = 0; i < lista1.length; i++) {
        var encontrado = false;
        for(var j = 0; j < lista2.length; j++) {
            if(lista1[i].nombre === lista2[j].nombre && lista1[i].id === lista2[j].id) {
                encontrado = true;
                break;
            }
        }
        if(!encontrado) {
            lista_faltantes_en_lista_2.push(lista1[i].nombre);
        }
    }
    cantidad_faltantes_en_lista_2 = lista_faltantes_en_lista_2.length;
    alert(`Cantidad de elementos presentes en lista uno y faltantes en lista dos: ${cantidad_faltantes_en_lista_2}`);
    console.log(lista_faltantes_en_lista_2);
}

Ahi utilizamos una variable booleana encontrado que se establece en 'true' cuando se encuentra un nombre que coincide en la lista 2. Después de recorrer la lista 2, verificamos si encontrado sigue siendo 'false'. Si lo es, significa que el nombre no coincidió con ninguno de los nombres en la lista 2 y se agrega a la lista de faltantes.

Al igual cantidad_faltantes_en_lista_2 queda fuera del bucle anidado y lo hemos colocado después del bucle principal, para que se actualice correctamente con la cantidad correcta de nombres faltantes en la lista 2.

Un saludo