【问题标题】:Return array of names from array of objects从对象数组中返回名称数组
【发布时间】:2020-03-27 14:36:54
【问题描述】:

我知道如何遍历一个对象并打印出我想要的一组值,但是我无法确定按我想要的顺序打印它。

**问题是:**

给定一组游戏结果记录,通过返回一组玩家姓名来确定所有玩家是谁。

该数组应按照遇到名称的方式排序。

示例输入:

[
  { 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', '徐瑾', '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));

【问题讨论】:

    标签: javascript arrays loops object filter


    【解决方案1】:

    您可以使用Array.reduce()Set 获取名称并删除重复项

    Array.reduce() 遍历数组。所以你可以将所有winners 和losers 推送到初始的空数组中。

    然后你可以创建一个新的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)

    【讨论】:

      【解决方案2】:

      您可以为此使用.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)],我们将在数组中获得不同的名称以实现所需的结果。

      【讨论】:

        【解决方案3】:
        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"]
        

        【讨论】:

          【解决方案4】:

          使用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)

          【讨论】:

          • 这与 OP 分享的预期结果不符:['Alishah', 'Bob', 'Maria', 'Xu Jin', 'Elise']
          【解决方案5】:

          查看您的代码和您的预期结果,我认为您缺少推入arr 以及looser 名称。要修复它,我最喜欢的方法是 js 数组的 reduce 方法:

          const arr = outcomes.reduce((completeList,{winner, looser}) => {
              const extraNames = [winner, looser]
                  .filter(x => !completeList.includes(x));
              return [
                  ...completeList,
                  ...extraNames
              ];
          }, []);
          

          【讨论】:

          • 这会产生重复,每个名字应该只出现一次。
          【解决方案6】:

          使用地图和过滤器

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 这也不符合 OP 分享的预期结果:['Alishah', 'Bob', 'Maria', 'Xu Jin', 'Elise']
            • @palaѕн 好收获。
            猜你喜欢
            • 1970-01-01
            • 2022-10-19
            • 1970-01-01
            • 2011-09-14
            • 1970-01-01
            • 2021-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多