我有一个表格,其中包含某事物的理论速率(id = ratebaseX)和某事物的实际观察率(id = rateseenX)。我有一个javascript贯穿每一对,简单计算差异(id = calcX)。
计算出这个差异后,我想根据计算出的差异对calcIDs数组进行冒泡排序。我实际上并不想更改calcIDs类中的html或任何东西,只是更改数组中的索引。
对于测试,我将前三个数组元素转储到一个警告框中,因为我知道它们最初是乱序的。
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实际上是一个指针数组?
答案 0 :(得分: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
没有返回数组。它返回type NodeList
的对象,而您通常只能在JS中对真正的数组进行排序。我的意思是您可以将排序算法应用于集合,但“排序”项目将按照排序前显示的相同预定义顺序显示。一个简单的解决方法可能是将节点集合转换为实际数组,如下所示:
var arr = Array.prototype.slice.call(nodes); // nodes = document.querySelectorAll(".your_selector");
然后您就可以应用排序并获得您的期望。它可以用于您的目的,因为您声明您不想更改视图。我希望这个迟到的答案有助于:)