Home > OS >  Looping through an array of objects.. how can I filter out duplicate names and return players in a n
Looping through an array of objects.. how can I filter out duplicate names and return players in a n

Time:01-18

I'm trying to iterate over an array of objects, and in a new array, return only the players, their names in the same order and not listed more than once.. Was thinking I could do something similar to this or with a forEach loop but I'm not really sure how to tackle the multiple occurrences

const players = function(outcomes) {

  const arr = [];
  for (let i = 0; i < outcomes.length; i  ) {
    if (outcomes.includes(winner, loser))
    arr.push(arr[i]);
  }
  return arr;

};

Example Input and Expected Output:

const playerNames = [
 { winner: 'Sam',   loser: 'Bruce',    loser_points: 10 },
  { winner: 'Sam',   loser: 'Hakim',  loser_points: 9 }]

Output I want: [Sam, Bruce, Hakim]

CodePudding user response:

const playerNames = [
    { winner: 'Sam',   loser: 'Bruce',    loser_points: 10 },
    { winner: 'Sam',   loser: 'Hakim',  loser_points: 9 }
];

var getPlayers = function(games) { 
    var players = {}; 
    var game;
    for (var i=0; i<games.length; i  ) {
        game = games[i];
        players[game.winner] = 1;
        players[game.loser] = 1;
    }
    return Object.keys(players);
}

console.log(getPlayers(playerNames));

CodePudding user response:

There are multiple ways to achieve this (please see other solutions posted). Below is a modified version of your code. Some minor corrections added in your if condition.

const playerNames = [{
    winner: 'Sam',
    loser: 'Bruce',
    loser_points: 10
  },
  {
    winner: 'Sam',
    loser: 'Hakim',
    loser_points: 9
  },
  {
    winner: 'Sam',
    loser: 'Paul',
    loser_points: 9
  }
];

const players = function(outcomes) {

  const arr = [];
  for (let i = 0; i < outcomes.length; i  ) {
    // check and push winner
    if (!arr.includes(outcomes[i].winner))
      arr.push(outcomes[i].winner);

    // check and push loser
    if (!arr.includes(outcomes[i].loser))
      arr.push(outcomes[i].loser);
  }
  return arr;

};


console.log(players(playerNames));

CodePudding user response:

Use Set to generate unique list of data.

const playerNames = [{ winner: 'Sam', loser: 'Bruce', loser_points: 10 },{ winner: 'Sam', loser: 'Hakim', loser_points: 9 }];
const players = Array.from(new Set(playerNames.flatMap((node) => [node.winner, node.loser])));
console.log(players);

CodePudding user response:

I updated my answer based on Elaine Alt one, because I really liked his/her approach!

(but using reduce instead)

const getNames = games => {
    return Object.keys(
        games.reduce((acc, game) => {
            return {
                ...acc,
                [game.winner]: 1,
                [game.loser]: 1,
            };
        }, {})
    );
};
  •  Tags:  
  • Related