2013-08-28 52 views
0

我有以下代码,在循环中创建对象,然后访问它们的值。现在我遇到了这个问题,即访问对象本身是可以的,但不是包含对象的数组。我在这里错过了什么吗?无法访问数组中的对象,但访问对象本身

camList = new Array(); 

for (var i=0; i<8; i++) 
{ 
    var camObj = new Camera(i); 
    camList.push(camObj); 
    console.log(camObj.id);  //this works 
    console.log(camList[i].id); //this doesnt 
} 

PS:在这个例子中,camObj.id只是返回当前值i。

PPS:我得到了TypeError:无法读取未定义的属性'id'。


编辑:

我添加了一个全码的例子。

相机对象:

var Camera = function(id, cam) 
{ 
    this.id = id; 
    this.cam = cam; 
    this.res = { 
        "x" : this.cam.get(CV_CAP_PROP_FRAME_WIDTH), 
        "y" : this.cam.get(CV_CAP_PROP_FRAME_HEIGHT) 
       }; 
    this.overlayData = new Array(); 
}; 

exports.Camera = Camera; 

主要代码:

var cv  = require("opencv-node"); 
var Camera = require("./cameraModule").Camera; 
var camList = new Array(); 

for (var i=0; i<8; i++) 
{ 
    var capture = new cv.VideoCapture(); 
    capture.open(i); 

    if (capture.isOpened()) 
    { 
     var camObj = new Camera(i, capture); 
     camList.push(camObj); 
     console.log(camList[i].id); //Here is the problem 
    } 
} 
+1

** **怎么不工作?怎么了? – SLaks

+2

你在哪里定义'camList'?你确定你的'我'与其索引?如果你使用console.log(camList);'? –

+0

同意@RocketHazmat - 索引可能没有对齐。 – tymeJV

回答

4

在每次循环迭代,您正在检查capture.isOpened()。如果那是false,会发生什么?

循环将继续而不是东西被推入camList。在下一个循环中,i将递增。假设capture.isOpened()变成true。当你插入数组时,i而不是与刚添加的元素对齐。 i将是一个(或更多)索引太大!

而不是做camList[i].id,尽量要做到这一点:

camList[camList.length - 1].id 
+0

好吧,这应该像你说的那样工作。我想创建一个只包含可打开捕获的对象的数组(capture.isOpend())。我将当前循环变量传递给我的对象,但对象本身在创建它的数组中有不同的索引。 – Fidel90

+0

@ Fidel90:然后不要使用'.push()',它增加了数组的* end *,无论索引是什么。我想你想手动设置索引。试试:'camList [i] = camObj'。 –

+0

但这就是我使用push的确切原因。我知道这里不容易理解我的意图:) – Fidel90

2

确保camList是你的循环开始前的空数组:

var camList = []; 
for (var i = 0; i < 8; i++) { 
    var camObj = new Camera(i); 
    camList.push(camObj); 
    console.log(camObj.id); 
    console.log(camList[i].id); 
} 
+0

他已经用'var camList = new Array();' – funkwurm

+0

@funkwurm来做到这一点:当问题首次发布时,该行不在其中。 –