2013-04-12 4 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 является связкой XML, разделенные сообщениями и triparray приведен список всех различных значений для «Trip» поле. Timearrayorig и timearray является самым ранним разом для каждого элемента triparray из элементов trainsfeed.)

Если я запустил этот скрипт и нашел значение timearrayorig и timearray в консоли отладки, они будут такими же, например [1365801720, 1365801180, 1365801600, 1365802800, 1365800940]. Но когда я сортирую timearray, они оба становятся [1365800940, 1365801180, 1365801600, 1365801720, 1365802800].

+0

массива в JavaScript является ссылочным типом, так что когда вы присваиваете timearrayorig к timearray вы просто присвоить ссылку на массив, если вы хотите, чтобы скопировать его попробовать массив slice method – 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]; 
Смежные вопросы