我试图迭代一个对象数组,在一个新数组中,只返回玩家,他们的名字按相同的顺序排列,并且不会列出多次。。我想我可以做一些类似的事情,或者使用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,
};
}, {})
);
};