You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript:如何用动态变量名访问歌词对象的ve系列属性?

解决动态访问歌词对象属性的问题

你的问题出在两个核心点上:

  1. 属性访问方式错误:你用lyrics.ve[i]尝试访问ve1、ve2这类属性,但JavaScript中这种写法会去查找lyrics下的ve数组,而你的结构里根本不存在ve数组,只有ve1、ve2这类独立属性。必须用方括号语法拼接属性名才能正确访问。
  2. 循环条件无效:lyrics是对象而非数组,没有length属性,所以allMusic[indexNumb - 1].lyrics.length会返回undefined,导致循环无法正常执行。

修正方案一(适配固定ve1到ve20的场景)

如果确定歌词属性是从ve1到ve20,直接循环1到20,用模板字符串拼接属性名:

function testingLyrics(){
  // 先获取当前歌曲的歌词对象,减少重复代码
  const currentLyrics = allMusic[indexNumb - 1].lyrics;
  
  // 循环ve1到ve20,i从1开始
  for (let i = 1; i <= 20; i++) {
    // 拼接属性名,用方括号访问动态属性
    const verse = currentLyrics[`ve${i}`];
    
    // 先判断属性是否存在,再检查stamp字段
    if (verse && verse.stamp) {
      /* 这里编写你的业务逻辑 */
      console.log(verse.ls); // 示例:打印歌词内容
    }
  }
}

修正方案二(适配任意数量ve开头属性的场景)

如果不确定ve属性的数量,或者未来可能增减,可以动态提取所有ve开头的属性:

function testingLyrics(){
  const currentLyrics = allMusic[indexNumb - 1].lyrics;
  
  // 获取所有以"ve"开头的属性名
  const verseKeys = Object.keys(currentLyrics).filter(key => key.startsWith('ve'));
  
  // 遍历每个ve属性
  for (const key of verseKeys) {
    const verse = currentLyrics[key];
    if (verse.stamp) {
      /* 这里编写你的业务逻辑 */
      console.log(verse.ls);
    }
  }
}

关键知识点

  • 动态属性访问:当属性名是动态生成的(比如带数字后缀),必须使用对象[属性名字符串]的方式,.语法仅适用于固定的属性名。
  • 对象属性遍历:Object.keys()可以获取对象的所有属性名数组,结合filter()可以筛选出目标属性,适配更灵活的业务场景。

内容的提问来源于stack exchange,提问作者Adam Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:23