JavaScript:如何用动态变量名访问歌词对象的ve系列属性?
解决动态访问歌词对象属性的问题
你的问题出在两个核心点上:
- 属性访问方式错误:你用
lyrics.ve[i]尝试访问ve1、ve2这类属性,但JavaScript中这种写法会去查找lyrics下的ve数组,而你的结构里根本不存在ve数组,只有ve1、ve2这类独立属性。必须用方括号语法拼接属性名才能正确访问。 - 循环条件无效:
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
相关产品推荐
相关产品推荐

