Javascript 2D数组问题 - 所有元素都是最终条目的副本

时间:2010-07-05 10:33:41

标签: javascript xml multidimensional-array

我正在从XML文件创建一个javascript 2D数组,然后在页面上显示之前根据需要进行操作和过滤。

当我遍历XML记录时,我稍微操纵数据,从中构建一个普通数组(rowRecord),然后将此数组添加到2D数组(dataSet)。事实上,我最终得到了一个漂亮的2D数组,但所有记录都是我正在添加的最后一条记录的重复。

使用一些警报我发现,当我添加第一条记录时,一切都很顺利。然后我添加第二条记录,我得到一个包含2条记录的dataSet,两条记录都是记录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 个答案:

答案 0 :(得分:2)

你应该在函数中创建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 :(得分:1)

移动: -

var rowRecord     = new Array();

就在之前: -

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

否则,您将继续重复使用相同的数组对象实例,并在每次迭代时覆盖其内容。外部数组中的所有条目都指向该数组的同一单个实例。

答案 2 :(得分:1)

变化:

var dataSet       = new Array(rowRecord);

为:

var dataSet       = [];

更新:按照@AnthonyWJones

移动dataSet声明