繁体   English   中英

从对象数组返回名称数组

[英]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()遍历数组。 因此,您可以将所有winnerloser都推送到初始空数组。

然后你可以创建一个新的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()方法,我们将首先获得一个数组数组。 这里的内部数组将是winnerloser名称的数组。
  • 然后我们将展平数组以获得所有玩家姓名的单个数组。
  • 最后使用[...new Set(array)]我们将在数组中获得不同的名称以实现所需的结果。

使用reduceincludes

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM