2013-08-28 54 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來做到這一點:當問題首次發佈時,該行不在其中。 –