2016-01-08 2 views
2

У меня есть таблица, которая содержит теоретическую скорость чего-то (id = ratebaseX) и фактическую наблюдаемую скорость чего-то (id = rateseenX). У меня есть javascript, который проходит через каждую пару и просто вычисляет разницу (id = calcX).Bubble sort on elements

После вычисления этой разницы я хотел бы сделать сортировку пузырьков в массиве calcIDs на основе этой расчетной разницы. Я действительно не хочу менять html или что-нибудь в классе calcIDs, просто индекс в массиве.

Для тестов я выгружаю первые три элемента массива в окно предупреждения, потому что знаю, что они изначально не в порядке.

function calcLikelihood(){ 
    ratebaseIDs = document.querySelectorAll('[id^="ratebase"]'); 
    rateseenIDs = document.querySelectorAll('[id^="rateseen"]'); 
    calcIDs = document.querySelectorAll('[id^="calc"]'); 

    for(i=0;i<calcIDs.length;i++){ 
     likelihood = Math.round((ratebaseIDs[i].innerHTML - rateseenIDs[i].innerHTML)*100)/100; 
     calcIDs[i].innerHTML = likelihood; 
     calcIDs[i].likelihood = likelihood; 
    } 
    //bubble sort based on likelihood 
    for(i=0;i<calcIDs.length;i++){ 
     for(j=0;j<(calcIDs.length-1);j++){ 
      if(calcIDs[j].likelihood<calcIDs[j+1].likelihood){ 
       temp = calcIDs[j]; 
       calcIDs[j] = calcIDs[j+1]; 
       calcIDs[j+1] = temp; 
      } 
     } 
    } 
    alert("0) " + calcIDs[0].likelihood +"\n1) " + calcIDs[1].likelihood+"\n2) " + calcIDs[2].likelihood); 
} 

Проблема в том, что первые три элемента не перемещаются. Я уверен, что правильно определил порядок сортировки пузырьков. Я думаю, проблема в том, что calcIDs acatally - массив указателей?

+0

Чтобы сами элементы HTML были перемещены, вам нужно будет * удалить их, а затем * добавить их обратно в правильном порядке. –

+4

Если это не для задания, в котором вам необходимо реализовать сортировку пузырьков, я не могу думать о худшем выборе алгоритма. Если вы просто после сортировки массива, ваш лучший выбор - использовать метод sort() класса Array. –

+0

@MattBurland - 'удалить их, а затем добавить их' - добавление их удаляет их из исходного местоположения, поэтому это не совсем правильно: D –

ответ

0

Ваша пузырьковая сортировка в порядке, я проверил:

var calcIDs = [{likelihood: 84}, {likelihood: 56}, {likelihood: 68}, {likelihood: 81}];  
 
    //bubble sort based on likelihood 
 
    for(i=0;i<calcIDs.length;i++){ 
 
     for(j=0;j<(calcIDs.length-1);j++){ 
 
      if(calcIDs[j].likelihood<calcIDs[j+1].likelihood){ 
 
       temp = calcIDs[j]; 
 
       calcIDs[j] = calcIDs[j+1]; 
 
       calcIDs[j+1] = temp; 
 
      } 
 
     } 
 
    } 
 

 
console.log("0) " + calcIDs[0].likelihood +"\n1) " + calcIDs[1].likelihood+"\n2) " + calcIDs[2].likelihood); 
 
// 84, 81, 68

Так что, я думаю, что проблема в том, что document.querySelectorAll не возвращает массив. Он возвращает объект typeNodeList, тогда как вы обычно можете сортировать только истинные массивы в JS. Я имею в виду, что вы можете применить алгоритм сортировки к коллекции, но «отсортированные» элементы будут показаны в том же предопределенном порядке, который был показан перед сортировкой. Простое решение может быть преобразование набора узлов в реальный массив как это:

var arr = Array.prototype.slice.call(nodes); // nodes = document.querySelectorAll(".your_selector"); 

, и тогда вы сможете применить сортировку и получить то, что вы ожидаете. Это нормально для вашей цели, потому что вы заявляете, что не хотите менять представление. Надеюсь, этот поздний ответ поможет :)