Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套多个级别的array.map()_Javascript - Fatal编程技术网

Javascript 嵌套多个级别的array.map()

Javascript 嵌套多个级别的array.map(),javascript,Javascript,我有一个javascript数组,其中有三个对象,每个对象都有一个数组(teamLineup),还有两个对象(team),每个对象都有另一个数组(Starter),最后有我试图提取的对象(player.name)。三个顶级对象具有以下结构: let game1 = { teamLineup: [{ team: { actual: { starters: [{ player: {name: 'Joe'},

我有一个javascript数组,其中有三个对象,每个对象都有一个数组(teamLineup),还有两个对象(team),每个对象都有另一个数组(Starter),最后有我试图提取的对象(player.name)。三个顶级对象具有以下结构:

let game1 = { teamLineup: [{
      team: {
        actual: {
          starters: [{
            player: {name: 'Joe'},
            player: {name: 'Kim'}
          }]
        }
      }
    },{
      team: {
        actual: {
          starters: [{
            player: {name: 'John'},
            player: {name: 'Shauna'}
          }]
        }
      }
    }]
  }

(game2....game3)
我正在尝试将原始数组缩减为一个数组,其中只有玩家名称作为字符串

let games = [game1, game2, game3]

let allStartingPlayers = games.map(a => a.teamLineup.map( b => b.team.actual.starters.map(c => c.player.name)))

console.log(allStartingPlayers);
样本输出:

[ [ [ 'Kim' ], [ 'Shauna' ] ],
  [ [ 'Nicole' ], [ 'Jennifer' ] ],
  [ [ 'Sandy' ], [ 'David' ] ] ]

有两个问题。首先,它只获取每个启动器数组中的第二个player.name。其次,它返回3个嵌套数组。

您的JSON是错误的。即启动器阵列。您需要将每个玩家分别作为一个对象

关于具有多个嵌套数组的第二个问题,可以使用forEach()对对象进行迭代,最后只将player.name放入结果中

见下文

let game1={teamLineup:[{
小组:{
实际:{
初学者:[
{玩家:{名字:'Joe'}},
{玩家:{名字:'金'}
]
}
}
},{
小组:{
实际:{
初学者:[
{玩家:{名字:'John'}},
{玩家:{姓名:'Shauna'}}
]
}
}
}]
};
让game2={teamLineup:[{
小组:{
实际:{
初学者:[
{玩家:{name:'Joe2'}},
{玩家:{name:'Kim2'}}
]
}
}
},{
小组:{
实际:{
初学者:[
{玩家:{名字:'John2'}},
{玩家:{姓名:'Shauna2'}}
]
}
}
}]
};
让game3={teamLineup:[{
小组:{
实际:{
初学者:[
{玩家:{name:'Joe3'}},
{玩家:{名字:'Kim3'}}
]
}
}
},{
小组:{
实际:{
初学者:[
{玩家:{名字:'John3'}},
{玩家:{姓名:'Shauna3'}}
]
}
}
}]
};
让游戏=[game1,game2,game3]
让所有StartingPlayer=[];
games.forEach(a=>a.teamLineup.forEach(b=>b.team.actual.starters.forEach(c=>allStartingPlayers.push(c.player.name)))

console.log(所有StartingPlayer)您只需要2张
地图
。一个用于主阵列,一个用于
启动器
阵列

然后可以使用
[].concat(…arr)
将结果展平

let game1={teamLineup:[{
小组:{
实际:{
初学者:[
{玩家:{名字:'Joe'}},
{玩家:{名字:'金'}
]
}
}
},{
小组:{
实际:{
初学者:[
{玩家:{名字:'John'}},
{玩家:{姓名:'Shauna'}}
]
}
}
}]
};
让game2={teamLineup:[{
小组:{
实际:{
初学者:[
{玩家:{姓名:'Albert'}},
{玩家:{姓名:'Samantha'}}
]
}
}
},{
小组:{
实际:{
初学者:[
{玩家:{名字:'Jina'}},
{玩家:{名字:'Rob'}}
]
}
}
}]
};
const games=[game1,game2];
const result=[].concat(…[].concat(…games.map(game=>game.teamLineup.map)(g=>g.team.actual.starters.map(s=>s.player.name(')));

控制台日志(结果)首先,看起来您丢失了一些花括号。在你的样品上你写

starters: [{
        player: {name: 'Joe'},
        player: {name: 'Kim'}
      }]
也就是说

starters[{player:{name: 'Kim'}}]
所以,也许我们可以将这部分代码重写为

starters: [
       {player: {name: 'Joe'}},
       {player: {name: 'Kim'}}
        ]
那么,根据我的拙见,你可以像这样混合使用reduce和map

let allStartingPlayers = games.reduce((a,v) => a.concat(v.teamLineup.reduce( (a,b) =>a.concat(b.team.actual.starters.map(c => c.player.name)),[])),[]);

[{player:{name:'Joe'},player:{name:'Kim'}}]
无效。一个。。。。谢谢,现在它可以正确循环了!我简化了上面的示例,并在发布之前对其进行了测试,打字错误阻止了我意识到我有正确的代码!谢谢你的好心先生。不过一个阵列中有3个游戏,当我移除第一个地图时,它不会循环通过所有游戏。