2013-09-19 3 views
3

У меня есть два файла .js. В одном я хочу заполнить массив объектами, которые имеют два свойства. В другом файле я хочу перебрать массив и работать со свойствами объектов.Javascript: read Array of Objects

Моя кодирования выглядит следующим образом:

file1.js

var selection = new Object(); 
selection.column = ""; 
selection.term = ""; 

var selectionContainer = new Array(); 
... 
press: function(){ 
var i; 
for (i=1;i<=selectionContainer.length;i++){ 
    selection = selectionContainer[i]; 
    alert("Search Term: " + selection.column + selection.term); 
} 
} 

file2.js

change: function(oEvent){ 
selection.column = "someText"; 
selection.term = "someOtherText"; 
selectionContainer[nrOfEntries] = selection; 
} 

При выполнении JavaScript я получаю «Uncaught TypeError: Не удается прочитать свойство 'столбец' неопределенного ".

Что я делаю неправильно?

ответ

0

В JS массивы начинаются с индекса 0, и последний элемент будет на .length - 1. Таким образом, вы должны изменить свой цикл, чтобы начать в 0 и использовать <, а не <=:

for (i=0;i<selectionContainer.length;i++){ 

Ошибка вы получили, Uncaught TypeError: Cannot read property 'column' of undefined', потому что когда ваш счетчик встал на selectionContainer.length вы пытались прочитать элемент просто мимо конец массива, который сам по себе не дает ошибки, он просто возвращает undefined, но затем undefined.column дает ошибку.

Но также - хотя это немного сложно сказать, потому что я не уверен в коде, который вы не показываете - в коде вы do показать, что похоже, что вы заполняете свой массив несколькими ссылками на тот же объект, потому что в вашей функции change вы обновляете свойства существующего объекта selection, а затем помещаете ссылку на этот объект в массив. Я считаю, что вам нужно создать новый объект в этой точке:

change: function(oEvent){ 
    selection = new Object(); 
    selection.column = "someText"; 
    selection.term = "someOtherText"; 
    selectionContainer[nrOfEntries] = selection; 
} 

... но проще всего просто использовать литерал объекта:

change: function(oEvent){ 
    selectionContainer[nrOfEntries] = { column : "someText", term : "someText" }; 
} 

Вы не говорите, что nrOfEntries является , но вам не нужна отдельная переменная, чтобы отслеживать количество элементов в массиве, когда JS предоставляет вам свойство .length.В любом случае, если вы просто пытаетесь добавить в конец массива вы можете сделать это:

selectionContainer.push({ column : "someText", term : "someText" }); 

В целом считается хорошей практикой использовать литералы массивов и объектов литералов для создания пустых массивов и объектов, поэтому начало вашего кода может быть:

var selection = {}; 
... 
var selectionContainer = []; 
0

Прежде всего - почему вы начать цикл из индекса 1. Не правда ли правильно, если вы начинаете с первого элемента:

for (var i=0;i<selectionContainer.length;i++) { 

Во-вторых, лучше использовать метод нажимной добавить элементов массива. Например:

selectionContainer.push(selection); 
nrOfEntries = selectionContainer.length; 

Если это не помогает, то нам нужно больше информации о nrOfEntries и как она изменяется.

+0

Прежде всего - зачем вы заканчиваете цикл с индексом i <= selectionContainer.length. Разве это не правильно, если вы закончите с последним элементом + 1; – moritzpflaum

+0

Правильно. Я пропустил удаление = – Krasimir

0
change: function(oEvent){ 
    selection.column = "someText"; 
    selection.term = "someOtherText"; 
    selectionContainer[nrOfEntries] = selection;  
} 

Изменить его

change: function(oEvent) { 
     selectionContainer.push({column : 'someText', term : 'someOtherText}); 
} 

Вам не т необходимости я больше, и вы избежите забыть заполнить selectionContainer [0]

+1

Неправильный синтаксис вашего объекта: используйте двоеточия, а не знаки равенства. – nnnnnn