尝试使用React/Javascript中的开关大小写将ID转换为字符串

尝试使用React/Javascript中的开关大小写将ID转换为字符串,javascript,reactjs,Javascript,Reactjs,我有个初学者的问题。也许有人能帮我。 我正在使用一个电影API(TheMovieDb),并尝试将电影类型ID转换为字符串。API返回类别的ID,而不是标签或名称。 因此,我创建了一个switch case,其中每个id对应于它的类别(例如:“28”对应于“Action”),但我不能在我的组件中使用它 这是我的构造函数: constructor(props){ super(props); this.state = { films: [], page: 1,

我有个初学者的问题。也许有人能帮我。 我正在使用一个电影API(TheMovieDb),并尝试将电影类型ID转换为字符串。API返回类别的ID,而不是标签或名称。 因此,我创建了一个switch case,其中每个id对应于它的类别(例如:“28”对应于“Action”),但我不能在我的组件中使用它

这是我的构造函数:

constructor(props){
    super(props);
    this.state = {
      films: [],
      page: 1,
      loading: false,
      genre: null
    };
}

以下是我的功能:

buildGenres(state, val) {
    if (state === 'genre') {
      val = convertGenres(val);
    }
    this.setState({ [state]: val });
  }

这是我的开关盒:

module.exports = {
  convertGenres: (genre) => {
    switch (genre) {
    case '12':
      return'Adventure';
    case '16':
      return'Animation';
    case '28':
      return'Action';
    case '35':
      return'Comedy';
    case '80':
      return'Crime';
    case '99':
      return'Documentary';
    case '18':
      return'Drama';
    case '10751':
      return'Family';
    case '14':
      return'Fantasy';
    case '36':
      return'History';
    case '27':
      return'Horror';
    case '10402':
      return'Music';
    case '9648':
      return'Mystery';
    case '10749':
      return'Romance';
    case '878':
      return'Science Fiction';
    case '10770':
      return'TV Movie';
    case '53':
      return'Thriller';
    case '10752':
      return'War';
    case '37':
      return'Western';
    default:
      return genre;
    }
  }
};

我试着在我的组件中使用.map,但我只能在工具提示标题中使用film.genre\u ID来获取ID。 如何执行“如果类型=28”,则类型为“动作”:

const theMovies=this.state.films.map((电影,索引)=>{
返回(959?“顶部”:“顶部”}
>
)})
我真的不确定我使用的方法是否正确,所以如果你有更好的想法,我将非常感激。
提前谢谢

另一种方法是在代码中已经定义了
enum
类型对象

const stringIds = Object.freeze({ '12' :'Adventure', '16' : 'Animation', ...})
因此,您可以直接从对象访问
字符串
ID,即,
stringID['12']='Adventure'

对于您的
默认情况
,您可以检查
数字字符串
id是否返回
未定义
,如果返回,请按原样使用
类型
。为了便于使用,您还可以将此逻辑包含在函数中,如
getConvertGenres

const getConvertGenres = (genre) => stringIds[genre] ? stringIds[genre] : genre
因此,您的
映射
渲染

const theMovies = this.state.films.map((film, index) => {
  return(<Tooltip 
                TransitionComponent={Zoom}
                id="Add to favorite"
                title={<p>Category:{getConvertGenres(film.genre_ids)}</p>}
                placement={window.innerWidth > 959 ? "top" : "top"}
              >
                <AppsIcon className={classes.iconsHover} />
         </Tooltip>)})

如果您有多个id字符串,请使用此函数,而不是使用
getConvertGenres

另一种方法是在代码中已经定义了
enum
类型对象

const stringIds = Object.freeze({ '12' :'Adventure', '16' : 'Animation', ...})
因此,您可以直接从对象访问
字符串
ID,即,
stringID['12']='Adventure'

对于您的
默认情况
,您可以检查
数字字符串
id是否返回
未定义
,如果返回,请按原样使用
类型
。为了便于使用,您还可以将此逻辑包含在函数中,如
getConvertGenres

const getConvertGenres = (genre) => stringIds[genre] ? stringIds[genre] : genre
因此,您的
映射
渲染

const theMovies = this.state.films.map((film, index) => {
  return(<Tooltip 
                TransitionComponent={Zoom}
                id="Add to favorite"
                title={<p>Category:{getConvertGenres(film.genre_ids)}</p>}
                placement={window.innerWidth > 959 ? "top" : "top"}
              >
                <AppsIcon className={classes.iconsHover} />
         </Tooltip>)})

如果您有多个id字符串,请使用此函数,而不是使用
getconvertGenes

如果使用switch case,您的类型将不会是动态的,如果moviedb更改了这些类型类别中的任何内容,则您可能必须更新代码并添加新的case语句

有一个单独的API来获取流派
https://api.themoviedb.org/3/genre/movie/list?api_key=&language=en-US
返回如下对象数组的列表:

let genres = [{
  "id": 28,
  "name": "Action"
},
{
  "id": 12,
  "name": "Adventure"
}]
我有一个代码示例,它根据
genre\u id

class thetmdbap扩展了React.Component{
建造师(道具){
超级(道具)
此.state={
电影:[{
“人气”:59.54,
“计票”:792,
“视频”:假,
“海报路径”:“\/8j58iEBw9pOXFD2L0nt0ZXeHviB.jpg”,
“id”:466272,
“成人”:假,
“背景路径”:“\/kKTPv9LKKs5L3oO1y5FNObxAPWI.jpg”,
“原始语言”:“en”,
“原创标题”:“好莱坞的一段时间”,
“类型识别码”:[28,35,80,18,37],
“标题”:“曾经在好莱坞”,
“平均投票数”:7.6,
《概述》:“在1969年洛杉矶好莱坞黄金时代的最后几年里,一位退色的电视演员和他的特技演员双双努力在电影业获得名望和成功。”,
“发布日期”:“2019-07-26”
}, {
“人气”:45.265,
“计票”:526,
“视频”:假,
“海报路径”:“\/hgWAcic93phg4DOuQ8NrsgQWiqu.jpg”,
“id”:452832,
“成人”:假,
“背景路径”:“\/ooroxoq402tgk6nowmmuslfkw.jpg”,
“原始语言”:“en”,
“原名”:“宁静”,
“类型识别码”:[9648,53],
“标题”:“宁静”,
“平均投票数”:5.2,
《概述》:“贝克·迪尔是一名渔船船长,在一个名叫普利茅斯岛的宁静的热带飞地上带领着旅游团。然而,当他的前妻凯伦绝望地求助于他时,他的平静生活被打破了。”,
“发布日期”:“2019-01-25”
}, {
“人气”:50.454,
“计票”:113,
“视频”:假,
“海报路径”:“\/vOl6shtL0wknjaIs6JdKCpcHvg8.jpg”,
“id”:567609,
“成人”:假,
“背景路径”:“\/aNrNi5QExO6b8MnEGsfpgp21NIY.jpg”,
“原始语言”:“en”,
“原始标题”:“准备好或不准备好”,
“类型识别码”:[279648,53],
“标题”:“准备好或不准备好”,
“平均投票数”:7.5,
《概述》:“新娘的新婚之夜发生了一个险恶的转变,因为她古怪的新姻亲强迫她参加一个可怕的游戏。”,
“发布日期”:“2019-08-21”
}, {
“人气”:46.348,
“计票”:2284,
“视频”:假,
“海报路径”:“\/WGQ7APNFPF1TUVIKHXEE3KNSTV.jpg”,
“id”:447404,
“成人”:假,
“背景路径”:“\/nDP33LmQwNsnPv29GQazz59HjJI.jpg”,
“原始语言”:“en”,
“原始标题”:“神奇宝贝侦探皮卡丘”,
“类型识别码”:[28,12,14],
“标题”:“神奇宝贝侦探皮卡丘”,
“平均投票数”:7,
“概述”:“在一个人们收集口袋大小的怪物(神奇宝贝)进行战斗的世界里,一个男孩c