2010-07-05 32 views
1

我正在從XML文件創建JavaScript 2D數組,然後在顯示頁面之前根據需要對其進行操作和篩選。當我循環遍歷XML記錄時,我操縱數據一點,從它建立一個正常的數組(rowRecord),然後將此數組添加到二維數組(dataSet)。事情是,我結束了一個很好的二維數組,但所有的記錄都是我添加的最後一個記錄的重複。Javascript 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'); 
     } 
    } 
    ); 
} 

任何幫助或建議,將不勝感激。

回答

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; 
     } 
    // ... 
} 
+0

你的答案的組合已經解決了這個問題。謝謝大家! – Keef 2010-07-05 12:09:50

1

移動: -

var rowRecord  = new Array(); 

到之前: -

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

否則你繼續重新使用數組對象的同一個實例,覆蓋其上的每個迭代的內容。外部數組中的所有條目都指向該數組的同一個單一實例。

1

變化:

var dataSet  = new Array(rowRecord); 

到:

var dataSet  = []; 

UPDATE:與移動數據集中申報按@AnthonyWJones

相關問題