Ejercicios Javascript: Unión, Intersección y diferencia simétrica de listas de objetos - SoloCodigoWeb Saltar al contenido

Ejercicios Javascript: Unión, Intersección y diferencia simétrica de listas de objetos

Las listas en Python son una de las estructuras de datos más versátiles y poderosas, capaces de almacenar y manipular colecciones de elementos de manera eficiente. Cuando estas listas contienen objetos, se abren posibilidades aún más amplias para organizar y trabajar con datos complejos. Ya sea que estés gestionando una lista de libros, empleados, productos o cualquier otra colección de objetos, dominar las operaciones sobre estas listas es fundamental para desarrollar aplicaciones robustas y flexibles.

En esta publicación, exploraremos una serie de ejercicios prácticos diseñados para mejorar tus habilidades en el manejo de listas de objetos en Python. Cubriremos operaciones comunes como la unión, intersección, diferencia simétrica y diferencia de conjuntos.

Conceptos claves: Listas y Conjuntos (Set)

En JavaScript, tanto las listas (arrays) como los conjuntos (Set) son estructuras de datos que permiten almacenar colecciones de elementos, pero existen diferencias clave entre ellos en términos de características y comportamiento.

Array: Permite elementos duplicados, mantiene el orden de inserción, acceso por índices, y tiene métodos de manipulación avanzados.

Set: No permite duplicados, mantiene el orden de inserción, no tiene índices, y se utiliza para almacenar valores únicos.

Ejercicio 1: Biblioteca

Desarrollar un script que permita almacenar una lista de libros en una biblioteca. Los libros son objetos JS con dos atributos: ISBN y título. Desarrollar las siguientes funciones: Una función para agregar libros a la biblioteca, esta función deberá validar si el libro ya existe en la biblioteca. Una función para devolver la lista de libros de la biblioteca. Y una función que permita buscar si existe un libro mediante su ISBN.

/**
 * Función para agregar un libro a la colección biblioteca
 * @param {set} library 
 * @param {object} book 
 */
function addBook(library, book) {
    if (library.has(book)) {
        console.log(`Failed: El libro con ISBN "${book.isbn}" y título: "${book.title}" ya existe en la biblioteca.`);
    } else if (findBookByISBN(library,book.isbn)) {
        console.log(`Failed: El libro con ISBN "${book.isbn}" ya existe en la biblioteca.`);
    } else {
        library.add(book);
        console.log(`Success: El libro "${book.title}" ha sido agregado a la biblioteca.`);
    }
}

/**
 * Función para devolver lista de libros de la colección biblioteca
 * @param {set} library 
 */
function listBooks(library) {
    console.log("\nColección de libros");
    console.log("*".repeat(45));
    library.forEach(book => {
        console.log(`ISBN: ${book.isbn}`);
        console.log(`Title: ${book.title}`);
    });
    console.log("*".repeat(45));
}

/**
 * Función para buscar un libro en la colección biblioteca por su ISBN
 * @param {set} library 
 * @param {string} isbn 
 * @returns 
 */
function findBookByISBN(library, isbn) {
    for (let book of library) {
        if (book.isbn === isbn) {
            return book;
        }
    };
    return null;
}

/**
 * Función Principal
 */
function main() {
    let library = new Set();
    isbn = "978-0201485677"
    book2 = { isbn: isbn, title: "Refactoring: Improving the Design of Existing Code" };
    addBook(library, { isbn: "978-0135957059", title: "The Pragmatic Programmer: Your Journey to Mastery" });
    addBook(library, book2);
    addBook(library, { isbn: "978-0735619678", title: "Code Complete: A Practical Handbook of Software Construction" });
    addBook(library, book2);
    addBook(library, { isbn: isbn, title: "Advance Programming in C++" });
    listBooks(library);

    // Buscar un libro por ISBN
    let foundBook = findBookByISBN(library, isbn);
    if (foundBook) {
        console.log(`\nLibro con ISBN "${isbn}" encontrado: "${foundBook.title}"`);
    } else {
        console.log(`\nLibro no encontrado con ISBN ${isbn}`);
    }
}

main();

Resultado:

Success: El libro "The Pragmatic Programmer: Your Journey to Mastery" ha sido agregado a la biblioteca.
Success: El libro "Refactoring: Improving the Design of Existing Code" ha sido agregado a la biblioteca.
Success: El libro "Code Complete: A Practical Handbook of Software Construction" ha sido agregado a la biblioteca.
Failed: El libro con ISBN "978-0201485677" y título: "Refactoring: Improving the Design of Existing Code" ya existe en la biblioteca.
Failed: El libro con ISBN "978-0201485677" ya existe en la biblioteca.

Colección de libros
*********************************************
ISBN: 978-0135957059
Title: The Pragmatic Programmer: Your Journey to Mastery
ISBN: 978-0201485677
Title: Refactoring: Improving the Design of Existing Code
ISBN: 978-0735619678
Title: Code Complete: A Practical Handbook of Software Construction
*********************************************

Libro con ISBN "978-0201485677" encontrado: "Refactoring: Improving the Design of Existing Code"

Ejercicio 2: Unión de Listas de Objetos

Desarrollar un script que devuelva la unión de dos listas de objetos. La lista a devolver no deberá tener elementos repetidos.

/**
 * Función que devuelve la unión de dos listas de objetos
 * @param {*} list1 
 * @param {*} list2 
 * @returns 
 */
function union(list1, list2) {
    // Convertimos ambas listas a Set
    const set1 = new Set(list1.map(blog => JSON.stringify(blog)));
    const set2 = new Set(list2.map(blog => JSON.stringify(blog)));

    // Unimos ambos sets
    const union = new Set([...set1, ...set2]);

    return new Set([...union].map(blog => JSON.parse(blog)));
}

/**
 * Función Principal
 */
function main() {

    const blogList1 = [
        { url: "https://www.joelonsoftware.com/", author: "Joel Spolsky" },
        { url: "https://blog.codinghorror.com/", author: "Jeff Atwood" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" },
        { url: "https://alistapart.com/", author: "Jeffrey Zeldman" },
        { url: "https://overreacted.io/", author: "Dan Abramov" }
    ];

    const blogList2 = [
        { url: "https://waitbutwhy.com/", author: "Tim Urban" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" }, // Duplicado
        { url: "https://solocodigoweb.com/", author: "Gonzalo Chacaltana" },
        { url: "https://overreacted.io/", author: "Dan Abramov" } // Duplicado
    ];

    // Realizamos la unión de las dos listas de blogs
    const combinedBlogs = union(blogList1, blogList2);

    // Mostramos los blogs combinados
    console.log("Blogs combinados sin duplicados:");
    combinedBlogs.forEach(blog => console.log(`URL: ${blog.url}, Author: ${blog.author}`));
}

main();

Resultado:

Blogs combinados sin duplicados:
URL: https://www.joelonsoftware.com/, Author: Joel Spolsky
URL: https://blog.codinghorror.com/, Author: Jeff Atwood
URL: https://thedailywtf.com/, Author: Alex Papadimoulis
URL: https://alistapart.com/, Author: Jeffrey Zeldman
URL: https://overreacted.io/, Author: Dan Abramov
URL: https://waitbutwhy.com/, Author: Tim Urban
URL: https://solocodigoweb.com/, Author: Gonzalo Chacaltana

Ejercicio 3: Intersección de listas de objetos

Desarrollar un script que devuelva la intersección de dos listas de objetos. La lista a devolver deberá contener solo los objetos que existen en ambas listas.

/**
 * Función que devuelve la intersección de dos listas de objetos
 * @param {*} list1 
 * @param {*} list2 
 * @returns 
 */
function intersect(set1, set2) {
    return new Set([...set1].filter(blog1 =>
        [...set2].some(blog2 => blog1.url === blog2.url)
    ));
}

/**
 * Función Principal
 */
function main() {

    const blogList1 = new Set([
        { url: "https://www.joelonsoftware.com/", author: "Joel Spolsky" },
        { url: "https://blog.codinghorror.com/", author: "Jeff Atwood" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" },
        { url: "https://alistapart.com/", author: "Jeffrey Zeldman" },
        { url: "https://overreacted.io/", author: "Dan Abramov" }
    ]);

    const blogList2 = new Set([
        { url: "https://waitbutwhy.com/", author: "Tim Urban" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" }, // Duplicado
        { url: "https://solocodigoweb.com/", author: "Gonzalo Chacaltana" },
        { url: "https://overreacted.io/", author: "Dan Abramov" } // Duplicado
    ]);

    // Realizamos la intersección de los dos listas de objetos
    const commonBlogs = intersect(blogList1, blogList2);

    // Mostramos los blogs comunes
    console.log("Blogs comunes en ambas listas:");
    commonBlogs.forEach(blog => console.log(`URL: ${blog.url}, Author: ${blog.author}`));
}

main();

Resultado:

Blogs comunes en ambas listas:
URL: https://thedailywtf.com/, Author: Alex Papadimoulis
URL: https://overreacted.io/, Author: Dan Abramov

Ejercicio 4: Diferencia Simétrica de listas de objetos

Desarrollar un script que devuelva la diferencia simétrica de dos listas de objetos. La lista a devolver deberá contener los objetos que son únicos en ambas listas.

/**
 * Función que devuelve la diferencia simétrica de dos listas de objetos
 * @param {set} blogs1 
 * @param {set} blogs2 
 * @returns 
 */
function symetricDifferene(blogs1, blogs2) {
    return new Set(
        [...blogs1].filter(blog1 => ![...blogs2].some(blog2 => blog1.url === blog2.url))
            .concat(
                [...blogs2].filter(blog2 => ![...blogs1].some(blog1 => blog1.url === blog2.url))
            )
    );
}

/**
 * Función Principal
 */
function main() {

    const blogList1 = new Set([
        { url: "https://www.joelonsoftware.com/", author: "Joel Spolsky" },
        { url: "https://blog.codinghorror.com/", author: "Jeff Atwood" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" },
        { url: "https://alistapart.com/", author: "Jeffrey Zeldman" },
        { url: "https://overreacted.io/", author: "Dan Abramov" }
    ]);

    const blogList2 = new Set([
        { url: "https://waitbutwhy.com/", author: "Tim Urban" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" }, // Duplicado
        { url: "https://solocodigoweb.com/", author: "Gonzalo Chacaltana" },
        { url: "https://overreacted.io/", author: "Dan Abramov" } // Duplicado
    ]);

    // Obtenemos la diferencia simétrica de ambas listas de objetos
    const uniqueBlogs = symetricDifferene(blogList1, blogList2);

    // Mostramos los blogs únicos
    console.log("Blogs únicos (diferencia simétrica) en ambas listas:");
    uniqueBlogs.forEach(blog => console.log(`URL: ${blog.url}, Author: ${blog.author}`));
}

main();

Resultado:

Blogs únicos (diferencia simétrica) en ambas listas:
URL: https://www.joelonsoftware.com/, Author: Joel Spolsky
URL: https://blog.codinghorror.com/, Author: Jeff Atwood
URL: https://alistapart.com/, Author: Jeffrey Zeldman
URL: https://waitbutwhy.com/, Author: Tim Urban
URL: https://solocodigoweb.com/, Author: Gonzalo Chacaltana

Ejercicio 5: Diferencia de listas de objetos

Desarrollar un script que compare dos listas de objetos (Lista 1, Lista 2) y que devuelva los elementos de la Lista 1 que no están en la Lista 2 y elementos de la Lista 2 que no estan en la Lista 1.

/**
 * Función que devuelve la diferencia de dos listas de objetos
 * @param {set} set1 
 * @param {set} sett2 
 * @returns 
 */
function difference(set1, set2) {
    return new Set([...set1].filter(blog1 =>
        ![...set2].some(blog2 => blog1.url === blog2.url)
      ));
}

/**
 * Función Principal
 */
function main() {

    const blogList1 = new Set([
        { url: "https://www.joelonsoftware.com/", author: "Joel Spolsky" },
        { url: "https://blog.codinghorror.com/", author: "Jeff Atwood" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" },
        { url: "https://alistapart.com/", author: "Jeffrey Zeldman" },
        { url: "https://overreacted.io/", author: "Dan Abramov" }
    ]);

    const blogList2 = new Set([
        { url: "https://waitbutwhy.com/", author: "Tim Urban" },
        { url: "https://thedailywtf.com/", author: "Alex Papadimoulis" }, // Duplicado
        { url: "https://solocodigoweb.com/", author: "Gonzalo Chacaltana" },
        { url: "https://overreacted.io/", author: "Dan Abramov" } // Duplicado
    ]);

    // Obtenemos la diferencia de la lista 1 sobre la lista 2
    const blogListDiff1 = difference(blogList1, blogList2);

    // Mostramos resultados
    console.log("\nBlogs en blogList1 pero no en blogList2");
    blogListDiff1.forEach(blog => console.log(`URL: ${blog.url}, Author: ${blog.author}`));

    // Obtenemos la diferencia de la lista 2 sobre la lista 1
    const blogListDiff2 = difference(blogList2, blogList1);

    // Mostramos resultados
    console.log("\nBlogs en blogList2 pero no en blogList1");
    blogListDiff2.forEach(blog => console.log(`URL: ${blog.url}, Author: ${blog.author}`));
}

main();

Resultado:

Blogs en blogList1 pero no en blogList2
URL: https://www.joelonsoftware.com/, Author: Joel Spolsky
URL: https://blog.codinghorror.com/, Author: Jeff Atwood
URL: https://alistapart.com/, Author: Jeffrey Zeldman

Blogs en blogList2 pero no en blogList1
URL: https://waitbutwhy.com/, Author: Tim Urban
URL: https://solocodigoweb.com/, Author: Gonzalo Chacaltana

SUSCRÍBETE GRATIS

¿Quieres recibir más contenido como este en tu bandeja de entrada?

Recursos:

Publicado enProgramación
Secured By miniOrange