2017-01-23 165 views
0

我有一个对象内的对象数组。无法访问javascript中对象内数组元素的对象属性

为什么我会收到错误'Can not read property fname of undefined'below?我如何解决它?

另外,我是新来的JavaScript,并会欣赏任何造型或约定的建议。

https://jsfiddle.net/go1eu9z6/

function myObj() { 
    this.X = [], 

    this.haveEntries = function() { 
     return this.A.length > 0; 
    }, 

    this.add = function(fname_in, lname_in, city_in) { 
     var t = new Date().getTime()/1000; 

     var obj = { 
     fname: fname_in, 
     lname: lname_in, 
     city: city_in, 
     t_create: t 
     }; 

     this.X.push(obj); 

     return this; 
    } 
} 

var AB = {}; 
AB.X = new myObj(); 

AB.X.add("mike", 'smith', 'Toronto'); 

var s = AB.X[0].fname; // Error: Cannot read property fname of undefined 

document.getElementById('fname').innerHTML = s 
+1

在你的例子中,AB.X是'myObj'的一个实例。我想你的意思是'var AB = new myObj();' –

回答

0

代码示例,您还可以通过使用

var s = AB.X.X[0].fname; 
访问
+0

谢谢。简单的错误。仍然期待对代码的其他评论。 – user3341576

+0

我刚刚给你提供了使用你的代码的解决方案。但其他人给出的解决方案是很好的。 –

0

你并不需要做X MyObj中的一个实例。事实上,这就是破坏你的代码。当你myObject的一个新的实例被创建X,像这样:

var AB = new myObject(); 

那么你会调用这个AB对象上的add()方法,而不是在X:

AB.add('mike','smith','toronto'); 

最后,你会得到你的结果是这样的:

var firstName = AB.X[0].fname; 

这是一个小圆的约为什么构建这个对象,虽然。您如何知道哪个人的姓名和信息出现在X的哪个索引处?也许可以考虑使用一个对象来存储这些数据,并使用一些可以帮助您知道东西在哪里的关键字。可能看起来像:

var people = { 
    "uniqueID": {   // some uniqueID 
     "fname":"mike", 
     "lname":"smith", 
     "city":"toronto" 
    } 
} 
1

有一些问题与您的JavaScript代码。首先,您将AB.X赋值为新的Obj()而不是简单的AB。然后,你呼吁AB.X,add方法时,正确的调用会简单地AB.add - 看到与你现有的代码下面

function myObj() { 
    this.X = [], 

    this.haveEntries = function() { 
     return this.A.length > 0; 
    }, 

    this.add = function(fname_in, lname_in, city_in) { 
     var t = new Date().getTime()/1000; 

     var obj = { 
     fname: fname_in, 
     lname: lname_in, 
     city: city_in, 
     t_create: t 
     }; 

     this.X.push(obj); 

     return this; 
    } 
} 

var AB = {}; 
AB = new myObj(); 

AB.add("mike", 'smith', 'Toronto'); 

var s = AB.X[0].fname; 
+0

优秀的答案,adam davis –