Search code examples
javascriptarraysfunctionjavascript-objects

Use advanced functions to create new array of objects


Example of an object in the books array:

const books = [
  {
    id: "5f447132d487bd81da01e25e",
    title: "sit eiusmod occaecat eu magna",
    genre: "Science",
    authorId: 8,
    borrows: [
      {
        id: "5f446f2e2cfa3e1d234679b9",
        returned: false,
      },
      {
        id: "5f446f2ed3609b719568a415",
        returned: true,
      },
      {
        id: "5f446f2e1c71888e2233621e",
        returned: true,
      },
      {
        id: "5f446f2e6059326d9feb9a68",
        returned: true,
      },
      {
        id: "5f446f2ede05a0b1e3394d8b",
        returned: true,
      },
      {
        id: "5f446f2e4081699cdc6a2735",
        returned: true,
      },
      {
        id: "5f446f2e3900dfec59489477",
        returned: true,
      },
      {
        id: "5f446f2e6059326d9feb9a68",
        returned: true,
      },
      {
        id: "5f446f2e409f8883af2955dd",
        returned: true,
      },
      {
        id: "5f446f2e3900dfec59489477",
        returned: true,
      },
      {
        id: "5f446f2eae901a82e0259947",
        returned: true,
      },
      {
        id: "5f446f2ef2ab5f5a9f60c4f2",
        returned: true,
      },
      {
        id: "5f446f2ea6b68cf6f85f6e28",
        returned: true,
      },
      {
        id: "5f446f2eed18105706d6ca19",
        returned: true,
      },
      {
        id: "5f446f2eae901a82e0259947",
        returned: true,
      },
      {
        id: "5f446f2e91c2af00cb74e82b",
        returned: true,
      },
      {
        id: "5f446f2e5aa2bb5545a0f8a6",
        returned: true,
      },
      {
        id: "5f446f2ea508b6a99c3e42c6",
        returned: true,
      },
      {
        id: "5f446f2e50cc2da9cd80efdb",
        returned: true,
      },
      {
        id: "5f446f2e0b3e2ff72fc503e7",
        returned: true,
      },
      {
        id: "5f446f2e91c2af00cb74e82b",
        returned: true,
      },
      {
        id: "5f446f2ef795e593cd3cd19d",
        returned: true,
      },
      {
        id: "5f446f2e2f35653fa80bf490",
        returned: true,
      },
      {
        id: "5f446f2e7b9cd304fed3a8bc",
        returned: true,
      },
      {
        id: "5f446f2ed9aac23c0340aab2",
        returned: true,
      },
    ],
  },

Example of an object in the accounts array:

const accounts = [
  {
    id: "5f446f2ecfaf0310387c9603",
    picture: "https://api.adorable.io/avatars/75/[email protected]",
    age: 25,
    name: {
      first: "Esther",
      last: "Tucker",
    },
    company: "ZILLACON",
    email: "[email protected]",
    registered: "Thursday, May 28, 2015 2:51 PM",
  },

I need to write the function getBorrowersForBook() that does this: It should return an array of all the transactions from the book's borrows key. However, each transaction should include the related account information and the returned key, like so: (It should also limit the number of objects in the array to 10.)

getBorrowersForBook(book, accounts);
  [
    {
      id: "5f446f2e4eff1030e7316861",
      returned: true,
      picture: "https://api.adorable.io/avatars/75/[email protected]",
      age: 37,
      name: {
        first: "Barber",
        last: "Waters",
      },
      company: "KEGULAR",
      email: "[email protected]",
      registered: "Tuesday, April 14, 2020 9:15 PM",
    },
    {
      id: "5f446f2ecc5c4787c403f844",
      returned: true,
      picture: "https://api.adorable.io/avatars/75/[email protected]",
      age: 34,
      name: {
        first: "Dyer",
        last: "Trevino",
      },
      company: "SLAX",
      email: "[email protected]",
      registered: "Saturday, August 1, 2015 8:13 PM",
    },
  ]

This is what I have so far:

    function getBorrowersForBook(book, accounts) {
  const { name, company, email, registered } = accounts;
  const { borrows } = book;
  let resultArray = [];
  let resultObject = borrows.filter((borrow) => {
    if (borrow > 1) {
      resultArray.push({ borrows, name, company, email, registered });
    }
  });
  resultArray.sort((resultA, resultB) => (resultA > resultB ? -1 : 1));
  resultArray.splice(0, 10);
  return resultArray;
}

Solution

  • I suggest something like the following, based on the assumption that the borrower's ID exists in the accounts array.

    I'm not sure what you want to sort by, but the code below assumes you are sorting by company in ascending order; if it is not the case, you may adapt to fit your needs.

    function getBorrowersForBook(book, accounts) {
      // `borrows` is a list of transactions, each of type { id: string, returned: true }
      const { borrows } = book;
    
      const borrowers = borrows.map(({ id, returned })=> {
        // find account that matches the borrower's ID
        const account = accounts.find(account => account.id === id);
    
        // return the matching account, along with the `returned` info
        return {
          ...account,
          returned,
        };
      });
    
      return borrowers
        .sort((borrowerA, borrowerB) => {
          const companyA = borrowerA.company;
          const companyB = borrowerB.company;
          return companyA.localeCompare(companyB);
        })
        .slice(0, 10);
    }