将数组值分配给顶级对象 javascript

Assign array values to top level object javascript

底部是我尝试解析的 JSON 文件的精简版。我想创建具有团队名称和玩家名称键的单个对象。

我将如何使用球队名称并映射到每个球员并收到类似这样的信息(使用 javascript):

[
{ name: 'Dallas Stars', playerName: 'Alexander Radulov'},
{ name: 'Dallas Stars', playerName: 'Ben Bishop'},
{ name: 'Dallas Stars', playerName: 'Jamie Benn'}
...
{ name: 'Columbus Blue Jackets', playerName: 'Pierre-Luc Dubois'}
]

从这个JSON:

[ { name: 'Dallas Stars',
        roster:
         [ 'Alexander Radulov',
           'Ben Bishop',
           'Jamie Benn',
           'Tyler Pitlick',
           'Miro Heiskanen' ] },
      { name: 'Los Angeles Kings',
        roster:
         [ 'Jonathan Quick',
           'Jonny Brodzinski',
           'Oscar Fantenberg' ] },
      { name: 'San Jose Sharks',
        roster:
         [ 'Joe Thornton',
           'Brent Burns',
           'Joe Pavelski',
           'Antti Suomela' ] },
      { name: 'Columbus Blue Jackets',
        roster:
         [ 'Sonny Milano',
           'Brandon Dubinsky',
           'Nick Foligno',
           'Pierre-Luc Dubois' ] } ]

本质上,我正在尝试将顶级密钥对映射到各个玩家。我也尝试搜索所有 lodash 函数,但没有找到正确的方法。

有没有办法使用平面地图并多次使用团队名称?

您需要迭代外部数组项,然后在每个数组项内部迭代 rosterreduce 通常是在非一对一的基础上将一个数组转换为另一个数组的最合适的方法:

const input=[{name:'Dallas Stars',roster:['Alexander Radulov','Ben Bishop','Jamie Benn','Tyler Pitlick','Miro Heiskanen']},{name:'Los Angeles Kings',roster:['Jonathan Quick','Jonny Brodzinski','Oscar Fantenberg']},{name:'San Jose Sharks',roster:['Joe Thornton','Brent Burns','Joe Pavelski','Antti Suomela']},{name:'Columbus Blue Jackets',roster:['Sonny Milano','Brandon Dubinsky','Nick Foligno','Pierre-Luc Dubois']}];

const output = input.reduce((a, { name, roster }) => {
  roster.forEach((playerName) => {
    a.push({ name, playerName });
  });
  return a;
}, []);
console.log(output);

您也可以使用 map and flat

映射到原始数组,然后为每个 "mapped" 映射到其花名册并创建您想要的对象。最后,由于生成的数组将是 2d,所以将其展平:

var data = [{ name: 'Dallas Stars', roster: ['Alexander Radulov', 'Ben Bishop', 'Jamie Benn', 'Tyler Pitlick', 'Miro Heiskanen' ] }, { name: 'Los Angeles Kings', roster: ['Jonathan Quick', 'Jonny Brodzinski', 'Oscar Fantenberg' ] }, { name: 'San Jose Sharks', roster: ['Joe Thornton', 'Brent Burns', 'Joe Pavelski', 'Antti Suomela' ] }, { name: 'Columbus Blue Jackets', roster: ['Sonny Milano', 'Brandon Dubinsky', 'Nick Foligno', 'Pierre-Luc Dubois' ] } ];

var res = data
  .map(({name, roster}) =>
    roster.map(playerName => ({name, playerName})))
  .flat();

console.log(res);