Chaitanya GaneshRaju
Chaitanya GaneshRaju

Reputation: 41

Filter, Map and reduce

How can I write the function to filter the players who have won a particular award say FIFA FIFPro World XI award using the methods map, filter and reduce only.

No need to use the loops.

let players = [
      {
        name: "Marcelo",
        age: 30,
        debut: 2007,
        team: "Real Madrid",
        position: "Defender",
        country: "Brazil",
        url:
          "https://media.guim.co.uk/7247cfe16161d428218f34b5b0d7e5485bfa84a2/152_149_2221_1333/500.jpg",
        awards: [
          {
            name: "FIFA FIFPro World XI",
            year: 2019
          }
        ]
      },
      {
        name: "Virgil van Dijk",
        age: 26,
        debut: 2011,
        team: "Liverpool",
        position: "Defender",
        country: "Netherlands",
        url:
          "https://media.guim.co.uk/e798a161e0ecd2b27895aa6e5e8f29351db0d98c/0_130_5472_3283/500.jpg",
        awards: [
          {
            name: "UEFA Men's Player of the Year Award",
            year: 2019
          },
          {
            name: "FIFA FIFPro World X",
            year: 2019
          }
        ]
      }
    ];

Upvotes: 0

Views: 85

Answers (2)

Kostas
Kostas

Reputation: 1903

Using only filter and map.

let players = [
  {
    name: "Marcelo",
    age: 30,
    debut: 2007,
    team: "Real Madrid",
    position: "Defender",
    country: "Brazil",
    url:
      "https://media.guim.co.uk/7247cfe16161d428218f34b5b0d7e5485bfa84a2/152_149_2221_1333/500.jpg",
    awards: [
      {
        name: "FIFA FIFPro World XI",
        year: 2019
      }
    ]
  },
  {
    name: "Virgil van Dijk",
    age: 26,
    debut: 2011,
    team: "Liverpool",
    position: "Defender",
    country: "Netherlands",
    url:
      "https://media.guim.co.uk/e798a161e0ecd2b27895aa6e5e8f29351db0d98c/0_130_5472_3283/500.jpg",
    awards: [
      {
        name: "UEFA Men's Player of the Year Award",
        year: 2019
      },
      {
        name: "FIFA FIFPro World X",
        year: 2019
      }
    ]
  }
];
    
let playersFiltered = players.filter((player) => {
  let haveWonAtLeastOneAward = player.awards.map((award) => {
    return award.name.includes('FIFA FIFPro World XI');
  }).includes(true);
  
  return haveWonAtLeastOneAward;
});

console.log(playersFiltered);

Upvotes: 1

mickl
mickl

Reputation: 49985

Using Array.filter and Array.some seems to be the easiest way:

let players = [
      {
        name: "Marcelo",
        age: 30,
        debut: 2007,
        team: "Real Madrid",
        position: "Defender",
        country: "Brazil",
        url:
          "https://media.guim.co.uk/7247cfe16161d428218f34b5b0d7e5485bfa84a2/152_149_2221_1333/500.jpg",
        awards: [
          {
            name: "FIFA FIFPro World XI",
            year: 2019
          }
        ]
      },
      {
        name: "Virgil van Dijk",
        age: 26,
        debut: 2011,
        team: "Liverpool",
        position: "Defender",
        country: "Netherlands",
        url:
          "https://media.guim.co.uk/e798a161e0ecd2b27895aa6e5e8f29351db0d98c/0_130_5472_3283/500.jpg",
        awards: [
          {
            name: "UEFA Men's Player of the Year Award",
            year: 2019
          },
          {
            name: "FIFA FIFPro World X",
            year: 2019
          }
        ]
      }
    ];
    
 let awarded = players.filter(
      player => player.awards.some(
          award => award.name === 'FIFA FIFPro World XI'));
 
 console.log(awarded);

Upvotes: 4

Related Questions