在对象数组中循环.我如何过滤掉重复的名字并返回新数组中的玩家



我试图迭代一个对象数组,在一个新数组中,只返回玩家,他们的名字按相同的顺序排列,并且不会列出多次。。我想我可以做一些类似的事情,或者使用forEach循环,但我真的不确定如何处理多次出现的

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;
};

示例输入和预期输出:

const playerNames = [
{ winner: 'Sam',   loser: 'Bruce',    loser_points: 10 },
{ winner: 'Sam',   loser: 'Hakim',  loser_points: 9 }]
Output I want: [Sam, Bruce, Hakim]
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));

有多种方法可以实现这一点(请参阅发布的其他解决方案(。以下是您的代码的修改版本。在您的if条件中添加了一些小的更正。

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));

使用Set生成唯一的数据列表。

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);

我根据Elaine Alt one更新了我的答案,因为我真的很喜欢他/她的方法!

(但使用reduce(

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

最新更新