assume you have array of books with 1M records, eg.: ```json { "title": "Book title", "publishDate": "1-1-2001", "categories": ["romantic", "fiction"], "author": "Author Name", ... } ``` and you have an authors list with 100 records, eg. ```json { "name": "Author Name", "birthDate": "1-1-2001", "country": "Turkey", ... } ``` * every author name in the books list should have an associated record in the authors list * some authors might have no books in the list * things to consider: * your code should be efficient and fast * for each task, you can use the code written for prev tasks * you should write clean, readable, reusable code your tasks are : 1. write a code that finds the authors that have no books in the books list 2. write a code that returns the total number of books by each author 3. write a code that returns a list of the categories by each author 4. write a code that finds all unique categories among all the authors 5. write a code that returns an array of categories and a list of authors in each category ## Solution: To efficiently handle the large dataset and perform the tasks, we can use JavaScript's `Map` and `reduce` functions. These data structures and functions are more performant when dealing with large datasets compared to regular loops. Let's go through each task one by one: 1. Find authors that have no books in the books list: ```javascript function findAuthorsWithNoBooks(books, authors) { const authorsMap = new Map(authors.map((author) => [author.name, false])); books.forEach((book) => { authorsMap.set(book.author, true); }); const authorsWithNoBooks = []; authorsMap.forEach((hasBooks, authorName) => { if (!hasBooks) { authorsWithNoBooks.push(authorName); } }); return authorsWithNoBooks; } ``` 2. Return the total number of books by each author: ```javascript function getTotalBooksByAuthor(books) { const booksCountByAuthor = books.reduce((countMap, book) => { countMap.set(book.author, (countMap.get(book.author) || 0) + 1); return countMap; }, new Map()); return booksCountByAuthor; } ``` 3. Return a list of categories by each author: ```javascript function getCategoriesByAuthor(books) { const categoriesByAuthor = books.reduce((categoryMap, book) => { const { author, categories } = book; if (!categoryMap.has(author)) { categoryMap.set(author, []); } categoryMap.get(author).push(...categories); return categoryMap; }, new Map()); return categoriesByAuthor; } ``` 4. Find all unique categories among all authors: ```javascript function getAllUniqueCategories(books) { const allCategories = books.reduce((uniqueCategories, book) => { book.categories.forEach((category) => { if (!uniqueCategories.includes(category)) { uniqueCategories.push(category); } }); return uniqueCategories; }, []); return allCategories; } ``` 5. Return an array of categories and a list of authors in each category: ```javascript function getAuthorsByCategory(books) { const authorsByCategory = new Map(); books.forEach((book) => { const { author, categories } = book; categories.forEach((category) => { if (!authorsByCategory.has(category)) { authorsByCategory.set(category, []); } authorsByCategory.get(category).push(author); }); }); return Array.from(authorsByCategory.entries()); } ``` Now, you can use these functions to perform the tasks on your dataset. For example: ```javascript const books = [...]; // Your 1M records array of books const authors = [...]; // Your 100 records array of authors const authorsWithNoBooks = findAuthorsWithNoBooks(books, authors); const totalBooksByAuthor = getTotalBooksByAuthor(books); const categoriesByAuthor = getCategoriesByAuthor(books); const allUniqueCategories = getAllUniqueCategories(books); const authorsByCategory = getAuthorsByCategory(books); ``` ## Solution 2 In case the data in Array of object ```javascript [ { title: 'Book title', publishDate: '1-1-2001', categories: ['romantic', 'fiction'], author: 'Author Name', } ] ``` And ```javascript [ { name: 'Author Name', birthDate: '1-1-2001', country: 'Turkey', ... } ] ``` To accomplish the tasks efficiently and with clean, readable, and reusable code, we can use JavaScript's array methods and objects. Here's a step-by-step solution for each task: **Task 1: Find authors with no books** ```javascript function authorsWithNoBooks(books, authors) { const authorsWithBooks = new Set(books.map((book) => book.author)); return authors.filter((author) => !authorsWithBooks.has(author.name)); } // Usage const authorsWithNoBooksList = authorsWithNoBooks(booksArray, authorsArray); console.log(authorsWithNoBooksList); ``` **Task 2: Total number of books by each author** ```javascript function totalBooksByAuthor(books) { const booksByAuthor = {}; books.forEach((book) => { booksByAuthor[book.author] = (booksByAuthor[book.author] || 0) + 1; }); return booksByAuthor; } // Usage const booksByAuthorCount = totalBooksByAuthor(booksArray); console.log(booksByAuthorCount); ``` **Task 3: List of categories by each author** ```javascript function categoriesByAuthor(books) { const categoriesByAuthor = {}; books.forEach((book) => { const author = book.author; if (!categoriesByAuthor[author]) { categoriesByAuthor[author] = new Set(); } book.categories.forEach((category) => categoriesByAuthor[author].add(category)); }); return categoriesByAuthor; } // Usage const categoriesByAuthorsList = categoriesByAuthor(booksArray); console.log(categoriesByAuthorsList); ``` **Task 4: Find all unique categories among all authors** ```javascript function uniqueCategories(books) { const allCategories = new Set(); books.forEach((book) => { book.categories.forEach((category) => allCategories.add(category)); }); return Array.from(allCategories); } // Usage const uniqueCategoriesList = uniqueCategories(booksArray); console.log(uniqueCategoriesList); ``` **Task 5: Array of categories and authors in each category** ```javascript function authorsInEachCategory(books) { const authorsInCategory = {}; books.forEach((book) => { book.categories.forEach((category) => { if (!authorsInCategory[category]) { authorsInCategory[category] = []; } if (!authorsInCategory[category].includes(book.author)) { authorsInCategory[category].push(book.author); } }); }); return authorsInCategory; } // Usage const authorsInEachCategoryList = authorsInEachCategory(booksArray); console.log(authorsInEachCategoryList); ``` These functions should provide efficient solutions to each task while maintaining clean, reusable code. Please note that these solutions assume that the input data is well-formed and that the required data structures (e.g., booksArray, authorsArray) are already available in your code.