我正在创建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();
(trainfeed是由消息分隔的一堆XML,triparray是“Trip”字段的所有不同值的列表.timearrayorig和timearray是来自trainfeed元素的triparray的每个元素的最早时间。)< / p>
如果我运行此脚本并在调试控制台中找到timearrayorig和timearray的值,它们是相同的,例如[1365801720,136551180,136551600,1365802800,1365800940]。但是当我按时间排序时,它们都会变成[1365800940,136551180,1365801600,1365801720,1365802800]。
答案 0 :(得分:1)
timearray = timearrayorig;
这不是复制数组;它创建了第二个变量,它引用了相同的数组。仍然只有一个数组,这就是为什么排序它会影响两个变量。要copy the array,请执行:
var timearray = timearrayorig.slice();
有关详细信息,请参阅:Copying array by value in JavaScript。
答案 1 :(得分:0)
timearrayorig
持有对数组的引用,因此当您指定timearray = timearrayorig;
时,两个标签都引用相同的内存空间。
如果要复制数组,可以执行以下操作:
timearray = [];
for(var i = 0; i < timearrayorig.length; i++) timerray[i] = timearrayorig[i];