Javascript Создание массива объектов - PullRequest
0 голосов
/ 15 февраля 2012

Я немного новичок в 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, он отображает мне правильное количество значений, но отображаемое им значение Symbol: значение является последним, которое я ввелиcase "XYZn".

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

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

Ответы [ 2 ]

4 голосов
/ 15 февраля 2012

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

1 голос
/ 15 февраля 2012

В вашем коде:

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;

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

...