2013-04-12 49 views
0

我正在創建一個Chrome擴展,並使用排序的數組獲得一些奇怪的結果。我有兩個全局數組叫做「timearray」和「timearrayorig」(timearray是timearrayorig的排序版本)。在函數中,我在timearrayorig中設置了一堆值,然後將整個數組複製到timearray並對timearray排序。出於某種原因,這也排序timearrayorig。如果有人能解釋爲什麼會出現這種情況,我將不勝感激。數組排序創建鏈接數組?

for (var i = 0; i < triparray.length; i++) { 
    for (var j = 0; j < trainsfeed.length; j++) { 
     if (trainsfeed[j].getElementsByTagName('Trip')[0].childNodes[0].nodeValue == triparray[i]) { 
      if (timearrayorig.length < i + 1 || timearrayorig[i] > Number(trainsfeed[j].getElementsByTagName('Scheduled')[0].childNodes[0].nodeValue)) { 
       timearrayorig.push(Number(trainsfeed[j].getElementsByTagName('Scheduled')[0].childNodes[0].nodeValue)); 
      } 
     } 
    } 
} 
timearray = timearrayorig; 
//timearray.sort(); 

(trainsfeed是由消息和triparray分離一堆XML的是所有不同的值的「脫扣」字段。timearrayorig和timearray列表被用於從所述元件triparray的每個元件的最早時間)

如果我運行此腳本並在調試控制檯中找到timearrayorig和timearray的值,它們是相同的,例如[1365801720,1365801180,1365801600,1365802800,1365800940]。但是當我排序時間陣列時,它們都變成[1365800940,1365801180,1365801600,1365801720,1365802800]。

+0

陣列中的JavaScript是引用類型,所以當你分配timearrayorig到timearray你剛纔指定數組的參考,如果你想複製它嘗試陣列切片法 – Givi

回答

1
timearray = timearrayorig; 

這不拷貝陣列;它創建了第二個變量,它指的是相同的陣列。仍然只有一個數組,這就是爲什麼排序會影響這兩個變量。要copy the array,做到:

var timearray = timearrayorig.slice(); 

有關詳細信息,請參閱:Copying array by value in JavaScript

+0

非常感謝。這樣可行。 – csander

+0

你可以省略0並使用slice() – Givi

0

timearrayorig正在保存對數組的引用,所以當您分配timearray = timearrayorig;時,兩個標籤都引用相同的內存空間。

如果你願意,你可以這樣做數組複製:

timearray = []; 
for(var i = 0; i < timearrayorig.length; i++) timerray[i] = timearrayorig[i];