Проблема с 2D-массивом Javascript - все элементы являются копией последней записи - PullRequest
1 голос
/ 05 июля 2010

Я создаю двухмерный массив javascript из файла XML, который затем манипулирую и фильтрую по мере необходимости перед отображением на странице.

Когда я перебираю записи XML, я немного манипулирую данными,построить из него обычный массив (rowRecord) и затем добавить этот массив в 2D-массив (dataSet).Дело в том, что я получаю хороший 2D-массив, но все записи являются дубликатами самой последней записи, которую я добавляю.

Используя некоторые предупреждения, я обнаружил, что при добавлении первой записи всехорошо.Затем я добавляю вторую запись и получаю набор данных с 2 записями, каждая из которых является записью 2. Добавление третьих результатов в набор данных из 3 записей, каждая из которых является копией третьей записи.Это продолжается для всех 1300 записей, в результате чего получается 1300 идентичных записей, каждая из которых является последней записью в XML.

Вот код:

var rowRecord     = new Array();
var dataSet       = new Array(rowRecord);

function getAjaxTridionInfo() {
   var xmlFilename = 'filename.xml';
   // make ajax call here, create xml object
   xmlData = new Ajax.Request(xmlFilename,{
      method:'get',
      onSuccess: function(transport) {
         var dataObj = transport.responseXML;
         var vRoot   = dataObj.getElementsByTagName('Items')[0];
         for (var i=0; i<vRoot.childNodes.length; i++) {
            if (vRoot.childNodes[i].nodeType == 1) {
               var tridItem = vRoot.childNodes[i];

               rowRecord[0] = tridItem.childNodes[0].firstChild.nodeValue.substring(26);
               rowRecord[1] = tridItem.childNodes[1].firstChild.nodeValue;
               rowRecord[2] = tridItem.childNodes[2].firstChild.nodeValue;
               rowRecord[3] = rowRecord[1]+"/"+rowRecord[2];
               rowRecord[4] = false;
               rowRecord[5] = "n/a";
               rowRecord[6] = "n/a";
               rowRecord[7] = false;
               rowRecord[8] = "n/a";
               rowRecord[9] = "n/a";

               //do some other processing here to determine rowRecord[4] - [9]

               dataSet.push(rowRecord);
               rowCount += 1;
            }
         }
         //call next function here
      },

      onException: function(transport, exception) {
         throw(exception);
         alert('There has been a problem performing the Ajax call');
      }
   }
   );
}

Любая помощь или предложения будутбыть оцененным.

Ответы [ 3 ]

2 голосов
/ 05 июля 2010

Вы должны создать rowRecord в функции , а не снаружи, чтобы создавал новый массив для каждой записи строки .

// NO NEED TO DECLARE ROWRECORD HERE...
var dataSet = new Array(); // <- why would we add anything initially?

function getAjaxTridionInfo() {
  // ...
        if (vRoot.childNodes[i].nodeType == 1) {
           var tridItem = vRoot.childNodes[i];

           // IMPORTANT TO MAKE A NEW ARRAY HERE
           var rowRecord = new Array();

           rowRecord[0] = tridItem.childNodes[0].firstChild.nodeValue.substring(26);
           rowRecord[1] = tridItem.childNodes[1].firstChild.nodeValue;
           rowRecord[2] = tridItem.childNodes[2].firstChild.nodeValue;
           rowRecord[3] = rowRecord[1]+"/"+rowRecord[2];
           rowRecord[4] = false;
           rowRecord[5] = "n/a";
           rowRecord[6] = "n/a";
           rowRecord[7] = false;
           rowRecord[8] = "n/a";
           rowRecord[9] = "n/a";

           //do some other processing here to determine rowRecord[4] - [9]

           dataSet.push(rowRecord); // <- PUSHES THE NEW ARRAY
           rowCount += 1;
        }
    // ...
}
1 голос
/ 05 июля 2010

Изменить:

var dataSet       = new Array(rowRecord);

на:

var dataSet       = [];

ОБНОВЛЕНИЕ: и переместить объявление dataSet в соответствии с @ AnthonyWJones

1 голос
/ 05 июля 2010

Move: -

var rowRecord     = new Array();

до: -

rowRecord[0] = tridItem.childNodes[0].firstChild.nodeValue.substring(26);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...