2017-07-18 85 views
2

爲了好玩,我開始一些JavaScript上CheckiO。隨着中位任務,我有一個問題。首先,我嘗試使用for循環對給定數組進行排序。要在循環中查看數組,我使用了console.log排序與循環數組失敗

for (var i = 0; i < data.length-1; i++) { 
    if (data[i] > data[i+1]) { 
     var temp = data[i]; 
     data[i] = data[i+1]; 
     data[i+1] = temp; 
     i = 0; 
    } 
    console.log(data); 
} 

問題是隻有一個數字在錯誤的位置;排序停止,只是打印陣列幾次。 例如:

median([5,4,3,2,1]) 
[ 4, 5, 3, 2, 1 ] 
[ 4, 3, 5, 2, 1 ] 
[ 4, 3, 5, 2, 1 ] 
[ 4, 3, 2, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 5, 1 ] 
[ 4, 2, 3, 1, 5 ] 
[ 4, 2, 3, 1, 5 ] 
[ 4, 2, 1, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 
[ 4, 1, 2, 3, 5 ] 

對此行爲有任何解釋嗎?謝謝!

+0

你應該看看的https://developer.mozilla。組織/ EN-US /文檔/網絡/的JavaScript /參考/ Global_Objects /陣列/排序。 – ericwenn

+0

這種排序是否需要手動滾動,或者您可以使用'data.sort();'並完成它嗎? – James

+0

我修改了一下我的答案,以確保您理解並可以看到您的代碼和我的代碼有何不同。我認爲你這種分類循環的想法很簡單,很好,但它需要一些調試幫助才能達到終點。我希望我的回答不僅提供瞭解決方案,還提供了一種方式讓您自己瞭解如何在控制檯中看到自己的錯誤,並在調試中變得更好。 –

回答

1

沒有爲你實現對JavaScript的數組原型對象一個偉大的排序功能。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

然而,我打賭你知道這一點,並正在實施學習的目的該代碼。

在你的版本的bug涉及這個變量i

相反遞增,試試這個:

var i = 0; 
while(i < data.length) { 
    if(data[i] > data[i + 1]) { 
    var temp = data[i]; 
    data[i] = data[i + 1]; 
    data[i + 1] = temp; 
    i = 0; 
    continue; 
    } 

    i += 1; 
} 

因爲我們不知道所需要的迭代次數,這是更合適,更清晰使用while循環代替for循環。這樣一來,代碼是明確的i遞增當邏輯if語句評估爲假時才進行。

+0

我喜歡你對這個解決方案所做的。在我的版本中,我設置了i = -1,但continue實際上處理得很好,如果你讓你的代碼由多個用戶進行處理,可能會更有意義,而不需要評論,以確保有人不會破壞你的工作。做得很好。 –

+0

謝謝Kenneth! –

0

您的代碼失敗,因爲即使您在0123區段中設置了i=0,迭代完成後我也會增加並變爲1,因此它不會再次檢查數據[0]。 你可以做這樣的事情:

var data = [5,4,3,2,1]; 
 

 
for(var i = 0; i < data.length;) { 
 
    if(data[i]>data[i+1]) { 
 
     var temp = data[i]; 
 
     data[i] = data[i+1]; 
 
     data[i+1] = temp; 
 
     i = 0; 
 
    }else{ 
 
     i++; 
 
    } 
 
    console.log(data); 
 
}

0

你寫的代碼看起來只是它不檢查的第一要素精細由於循環迭代添加+1到我的價值。

爲了解決這個問題,只要設置你的i = -1;代替i = 0;

median([5,4,3,2,1]); 
 

 
function median(data) { 
 
    for(var i = 0; i < data.length-1; i++) { 
 
    \t \t //console.log(i, data[i], data[i+1], data); 
 
     if(data[i]>data[i+1]) { 
 
      var temp = data[i]; 
 
      data[i] = data[i+1]; 
 
      data[i+1] = temp; 
 
      i=-1; // Reset iterator so it is back to 0 on the next loop. 
 
     } 
 
     console.log(data); 
 
    } 
 
}

編輯:我添加的代碼註釋行到代碼段。如果您取消註釋和評論其他的console.log,你會得到輸出到告訴你你在索引,該索引值的控制檯,該指數值你比較它,然後將電流數組的狀態。嘗試將-1更改爲0,並查看它與將其重置爲-1的方式不同。

0

var a =[ 4, 5, 3, 2, 1 ]; 
 
var b =[ 4, 3, 5, 1, 2 ]; 
 
var c =[ 5, 3, 4, 2, 1 ]; 
 

 

 
function mySort(inArray) { 
 
    return inArray.sort(function(x,y) { return x>y ? 1 : -1}); 
 
} 
 

 
console.log(mySort(a)); 
 
console.log(mySort(b)); 
 
console.log(mySort(c));

這是你在找什麼?