2013-08-28 5 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 из неопределенного.


Edit:

Я добавил полный пример кода.

Объект

Камера:

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'? Вы уверены, что ваш 'i' соответствует индексу? Что вы видите, если вы '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()', который добавляет к * концу * массива, независимо от того, что этот индекс будет. Я думаю, вы хотите установить индекс вручную. Попробуйте: '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 varList = new Array(); ' – funkwurm

+0

@funkwurm: Когда вопрос был впервые отправлен, эта строка не была в нем. –

Смежные вопросы