使用映射函数将一个属性映射到另一个对象

问题描述 投票:0回答:1

我有一个如下所示的对象数组。

songs = [
  { 
    track_name: "name of track" , 
    track_genres: ["chamber pop","indie pop"] },
  { 
    track_name: "name of track 2" , 
    track_genres: ["dutch r&b","indie soul", "indie pop"] },
  { 
    track_name: "name of track 3" , 
    track_genres: ["indie pop","chamber pop","indie soul"] }
]

我有另一个看起来像这样的映射对象

genres = [
  {
    name: "Pop",
    children: [{name:"chamber pop"},{name:"indie pop"}]
  },
  {
    name: "R&B",
    children: [{name:"dutch r&b"}]
  },
  {
    name: "Soul",
    children: [{name:"indie soul"}]
  }
]

我想要做的是对于每个曲目,遍历曲目流派,并使用“流派”变量为每个曲目分配父流派。理想情况下,父流派不应重复。

预期输出:

const songs = [ 
{ 
  track_name: "name of track", 
  track_genres: ["chamber pop", "indie pop"], 
  parent_genres: ["Pop"] }, 
{ 
  track_name: "name of track 2", 
  track_genres: ["dutch r&b", "indie soul", "indie pop"], 
  parent_genres: ["R&B","Soul","Pop"] }, 
{ 
  track_name: "name of track 3", 
  track_genres: ["indie pop", "chamber pop", "indie soul"], 
  parent_genres: ["Pop", "Soul"] }
];
javascript arrays json sorting mapping
1个回答
0
投票
songs = [
  { 
    track_name: "name of track" , 
    track_genres: ["chamber pop","indie pop"] },
  { 
    track_name: "name of track 2" , 
    track_genres: ["dutch r&b","indie soul", "indie pop"] },
  { 
    track_name: "name of track 3" , 
    track_genres: ["indie pop","chamber pop","indie soul"] }
]

genres = [
  {
    name: "Pop",
    children: [{name:"chamber pop"},{name:"indie pop"}]
  },
  {
    name: "R&B",
    children: [{name:"dutch r&b"}]
  },
  {
    name: "Soul",
    children: [{name:"indie soul"}]
  }
]

const getParentGenres = (trackGenres) => {
  const parentGenres = new Set(); 
  trackGenres.forEach(trackGenre => {
    genres.forEach(genre => {
      if (genre.children.some(child => child.name === trackGenre)) {
        parentGenres.add(genre.name); 
      }
    });
  });

  return Array.from(parentGenres); 
};


const updatedSongs = songs.map(song => ({
  ...song,
  parent_genres: getParentGenres(song.track_genres)
}));

console.log(updatedSongs);
© www.soinside.com 2019 - 2024. All rights reserved.