2012-02-14 5 views
0

Я вроде как новичок в Javascript. Любая помощь или предложение относительно проблемы ниже высоко ценится.Javascript Создание массива объектов

Я хотел создать массив, в котором inturns содержит список объектов. Ниже кода суммирует моя проблема

{ 
    var Instrument = {}; 
    var InstrumentArray = new Array; 
    var array = new Array; 
    array[0] ="XYZ0"; 
    array[1] ="XYZ1"; 
    . 
    . 
    . 
    array[n] ="XYZn" ; 
    data1['Name'] = "X"; 
    data1['TypeString'] = "WatchList"; 
    data1['FileTypeString'] = "XLS"; 
    for (var i = 0; i < array.length; i++) { 

     Instrument['Symbol'] = array[i]; 
     InstrumentArray.push(Instrument); 
    } 
    for(var j =0; j< InstrumentArray.length;j++) 
    { 
     console.log(InstrumentArray[j]); 
    } 

    } 

Когда я смотрю на выход через console.log он показывает мне правильное количество значений, но символ: значение отображается является последним, что я поступил в этом случае "XYZn".

Я знаю, что последнее значение переопределяет объект Symbol, но в любом случае я могу получить все сохраненные значения.

Заранее спасибо

+0

где был объявлен 'data1'? – ggreiner

ответ

4

Это потому, что каждый элемент массива InstrumentArray является ссылкой на тот же объект Instrument, и вы постоянно менять свойства этого одного объекта. Есть много вещей, которые нужно улучшить в вашем коде, но короткий ответ заключается в создании Instrument внутри цикла.

+0

, так как я должен его решить, я имею в виду, что мне нужно иметь что-то вроде этого объекта {Symbol = "XYZ0"} Object {Symbol = "XYZ1"} ...... –

+0

В частности, переместите строку 'var Instrument = { }; 'так что это первая строка в цикле. Или просто 'InstrumentArray.push ({Symbol: array [i]})'.Что касается общего программирования Javascript, я бы прочитал хороший справочник, например http://eloquentjavascript.net/ – YXD

+0

Спасибо, что я получил вас –

1

В коде:

var Instrument = {}; 
var InstrumentArray = new Array; 

Хотя список формальных параметров может быть опущен при вызове конструктора с new, это не очень хорошая идея, так как это может быть неправильно истолковано как присвоение массива, а не новый экземпляр массива. В любом случае, массив буквальный, вероятно, лучший выбор (однозначная, меньше типа):

var InstrumentArray = []; 

То же самое для:

var array = ["XYZ0", "XYZ1", ... "XYZn"] 

В следующем:

data1['Name'] = "X"; 
data1['TypeString'] = "WatchList"; 
data1['FileTypeString'] = "XLS"; 

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

var data1 = {'Name': 'X', 'TypeString': 'WatchList', 'FileTypeString': 'XLS'}; 

который также много не подходит для ввода.

for (var i = 0; i < array.length; i++) { 
     Instrument['Symbol'] = array[i]; 
     InstrumentArray.push(Instrument); 
} 

Другие говорили вам, что здесь происходит, скорее всего, не то, что вы хотите. Обратите внимание, что там, где имена свойств соответствуют Рут для допустимых идентификаторов, точечная нотация может быть использован (который является немного более удобно):

 Instrument.Symbol = array[i]; 

Кроме того, поскольку вы добавляете пользователей в пустой массив с помощью счетчика, вам можно также сделать:

 InstrumentArray[i] = Instrument; 

, но, конечно, они не исправит проблему, они просто разные способы сделать то же самое (лучше?).

+0

спасибо за вклад, это определенно помогает в написании значащих js –

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