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

JavaScript调用函数时出现Uncaught TypeError: Cannot read properties of undefined (reading 'username')错误的原因及解决

问题原因与解决方案

你的代码有两个核心问题导致了这个TypeError:

1. 错误使用点语法访问动态属性

你在函数里写了datamodel.role1.username,这里的role1会被JavaScript当成字面量属性名,而不是你传入的变量值。也就是说,它会去datamodel里找一个叫"role1"的属性,但你的datamodel里根本没有这个属性,所以datamodel.role1返回undefined,再去读取undefined的username自然就报错了。

要通过变量访问对象属性,必须用方括号语法:datamodel[role1],这样JavaScript才会把role1当成变量,取它的值作为属性名。

2. 传入的参数格式无法直接用于属性访问

你传入的"administrator[0]"是一个完整的字符串,但datamodel里并没有名为"administrator[0]"的属性——administrator本身是一个数组,你需要先访问datamodel.administrator,再通过索引0获取数组里的元素,最后才能拿到username。直接把属性名和索引拼成一个字符串是无法被正确解析的。


两种可行的修复方案:

方案一:拆分参数(更简洁推荐)

把角色名和索引分开传入函数,这样直接用方语法访问数组即可:

datamodel = {
 administrator: [
  { username: "abc@xyz.com", password: "abc@1234", },
  { username: "abcd@xyz.com", password: "xyz@1234", },
 ],
};
function getLoginData(roleName, index) {
 console.log(roleName, index);
 let name = datamodel[roleName][index].username;
 console.log(name); // 输出abc@xyz.com
}
getLoginData("administrator", 0);

方案二:解析传入的字符串参数(如果必须保持原参数格式)

如果一定要传入"administrator[0]"这种格式的字符串,可以用正则表达式拆分出角色名和索引:

datamodel = {
 administrator: [
  { username: "abc@xyz.com", password: "abc@1234", },
  { username: "abcd@xyz.com", password: "xyz@1234", },
 ],
};
function getLoginData(role1) {
 console.log(role1);
 // 用正则匹配出角色名和索引
 const matchResult = role1.match(/^(\w+)\[(\d+)\]$/);
 if (matchResult) {
   const roleName = matchResult[1];
   const index = parseInt(matchResult[2], 10);
   let name = datamodel[roleName][index].username;
   console.log(name); // 输出abc@xyz.com
 } else {
   console.error("参数格式错误,请传入类似 'administrator[0]' 的格式");
 }
}
getLoginData("administrator[0]");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:22:29