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

从独立JS文件访问子属性时出现undefined问题的技术求助

解决遍历对象属性时返回undefined的问题

嘿,我完全懂你踩的这个坑!咱们先把问题拆明白:

你用for...in循环遍历persons对象时,循环变量name拿到的其实是对象的键名——也就是字符串类型的"something"和"somethingtwo",而不是这些键对应的那个包含email、num的子对象。所以你直接写name.email,本质是在问一个字符串有没有email属性,结果自然是undefined啦。

几种正确的解决方法

方法1:通过键名访问原对象的对应属性

这是最直接的修改方式,利用循环拿到的键名,去persons对象里取出对应的子对象,再访问它的属性:

var persons = require('./data.js');
var getAName = function() {
  for(var key in persons) {
    // 用persons[key]获取对应子对象,再访问email
    console.log(persons[key].email);
    // 同理,访问num就是persons[key].num
  }
}

我把变量名改成key了,这样更直观,避免和子对象里的name属性混淆~

方法2:用Object.values()直接遍历对象的值

如果你只关心对象里的子对象,不需要键名的话,可以用Object.values()把对象的所有值转换成数组,再用for...of循环遍历:

var persons = require('./data.js');
var getAName = function() {
  // Object.values(persons)会返回[something对象, somethingtwo对象]
  for(const person of Object.values(persons)) {
    console.log(person.email);
  }
}

这种方式代码更简洁,也更符合现代JS的写法。

方法3:用Object.entries()同时获取键和值

如果既需要键名,又需要子对象的话,Object.entries()会把对象转换成[键, 值]的数组,遍历起来很方便:

var persons = require('./data.js');
var getAName = function() {
  for(const [key, person] of Object.entries(persons)) {
    console.log(`键名:${key},邮箱:${person.email}`);
  }
}

额外小提示

如果你的对象可能继承了其他原型链上的属性,用for...in的时候可以加个判断,确保只遍历自身的属性:

for(var key in persons) {
  if(persons.hasOwnProperty(key)) {
    console.log(persons[key].email);
  }
}

不过在你的场景里,因为是自己导出的纯对象,这个判断不是必须的,但了解一下总是好的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:46