[英]Return array of names from array of objects
我知道如何循环遍历一个对象并打印出我想要的一组值,但是我无法按照我想要的顺序打印它。
**问题是: **
给定一组游戏结果记录,通过返回他们的姓名数组来确定所有玩家是谁。
数组应按名称的出现方式排序。
示例输入:
[
{ winner: 'Alishah', loser: 'Bob', loser_points: 3 },
{ winner: 'Maria', loser: 'Xu Jin', loser_points: 1 },
{ winner: 'Elise', loser: 'Bob', loser_points: 2 },
{ winner: 'Elise', loser: 'Maria', loser_points: 4 },
{ winner: 'Alishah', loser: 'Maria', loser_points: 2 },
{ winner: 'Maria', loser: 'Xu Jin', loser_points: 3 },
{ winner: 'Xu Jin', loser: 'Elise', loser_points: 2 }
]
预期结果:
['Alishah', 'Bob', 'Maria', 'Xu Jin', 'Elise']
**我到目前为止的代码:**
let data = [ { winner: 'Alishah', loser: 'Bob', loser_points: 3 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 1 }, { winner: 'Elise', loser: 'Bob', loser_points: 2 }, { winner: 'Elise', loser: 'Maria', loser_points: 4 }, { winner: 'Alishah', loser: 'Maria', loser_points: 2 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 3 }, { winner: 'Xu Jin', loser: 'Elise', loser_points: 2 } ]; console.log(main(data));
您可以使用Array.reduce()
和Set
来获取名称并删除重复项
Array.reduce()
遍历数组。 因此,您可以将所有winner
和loser
都推送到初始空数组。
然后你可以创建一个新的Set
。 这样,您可以删除重复项(因为所有项目都是string
)。 之后,您可以使用spread syntax
将其转换回数组: [...new Set(array)]
const arr = [ { winner: 'Alishah', loser: 'Bob', loser_points: 3 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 1 }, { winner: 'Elise', loser: 'Bob', loser_points: 2 }, { winner: 'Elise', loser: 'Maria', loser_points: 4 }, { winner: 'Alishah', loser: 'Maria', loser_points: 2 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 3 }, { winner: 'Xu Jin', loser: 'Elise', loser_points: 2 } ] const names = [...new Set(arr.reduce((acc, cur) => [...acc, cur.winner, cur.loser], []))] console.log(names)
您可以.flatMap()
使用.flatMap()
和Set()
:
let data = [ { winner: 'Alishah', loser: 'Bob', loser_points: 3 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 1 }, { winner: 'Elise', loser: 'Bob', loser_points: 2 }, { winner: 'Elise', loser: 'Maria', loser_points: 4 }, { winner: 'Alishah', loser: 'Maria', loser_points: 2 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 3 }, { winner: 'Xu Jin', loser: 'Elise', loser_points: 2 } ]; const res = [...new Set(data.flatMap(x=>[x.winner, x.loser]))] console.log( res )
解释:
.flatMap()
方法,我们将首先获得一个数组数组。 这里的内部数组将是winner
和loser
名称的数组。[...new Set(array)]
我们将在数组中获得不同的名称以实现所需的结果。 console.clear(); "use strict"; const score = [ { winner: 'Alishah', loser: 'Bob', loser_points: 3 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 1 }, { winner: 'Elise', loser: 'Bob', loser_points: 2 }, { winner: 'Elise', loser: 'Maria', loser_points: 4 }, { winner: 'Alishah', loser: 'Maria', loser_points: 2 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 3 }, { winner: 'Xu Jin', loser: 'Elise', loser_points: 2 } ] function reduce(coll, {winner, loser}) { if (!coll.includes(winner)) { coll.push(winner) } if (!coll.includes(loser)) { coll.push(loser) } return coll; } var players = score.reduce(reduce, []) console.log(players)
查看您的代码和您的预期结果,我认为您没有将arr
推入looser
名称。 为了修复它,我最喜欢的方法是 js 数组的reduce
方法:
const arr = outcomes.reduce((completeList,{winner, looser}) => {
const extraNames = [winner, looser]
.filter(x => !completeList.includes(x));
return [
...completeList,
...extraNames
];
}, []);
var players = collection.reduce((acc, player) => {
if(!acc.inStore[player.winner]) {
acc.players.push(player.winner)
acc.inStore[player.winner] = true
}
if(!acc.inStore[player.loser]) {
acc.players.push(player.loser)
acc.inStore[player.loser] = true
}
return acc;
}, {players: [], inStore: {}}).players
// ["Alishah", "Bob", "Maria", "Xu Jin", "Elise"]
使用地图和过滤器
let array = [
{ winner: 'Alishah', loser: 'Bob', loser_points: 3 },
{ winner: 'Maria', loser: 'Xu Jin', loser_points: 1 },
{ winner: 'Elise', loser: 'Bob', loser_points: 2 },
{ winner: 'Elise', loser: 'Maria', loser_points: 4 },
{ winner: 'Alishah', loser: 'Maria', loser_points: 2 },
{ winner: 'Maria', loser: 'Xu Jin', loser_points: 3 },
{ winner: 'Xu Jin', loser: 'Elise', loser_points: 2 }
];
let winners = array.map(i => i.winner).filter((x, i, a) => a.indexOf(x) == i)
console.log(winners);
const outcomes = [ { winner: 'Alishah', loser: 'Bob', loser_points: 3 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 1 }, { winner: 'Elise', loser: 'Bob', loser_points: 2 }, { winner: 'Elise', loser: 'Maria', loser_points: 4 }, { winner: 'Alishah', loser: 'Maria', loser_points: 2 }, { winner: 'Maria', loser: 'Xu Jin', loser_points: 3 }, { winner: 'Xu Jin', loser: 'Elise', loser_points: 2 } ]; const result = outcomes.reduce((acc, cur) => { if(!acc.includes(cur.winner)) acc.push(cur.winner); if(!acc.includes(cur.loser)) acc.push(cur.loser); return acc; }, []).join(","); console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.