2015-10-20 50 views
1

我遇到了返回原始數組而不是有序數組的函數的問題。我試圖切片數組並返回排序,但它不工作。有想法該怎麼解決這個嗎?不修改原始數組返回分類數組

function sortArr(comparator, array){ 

var newArray = array.slice(); 

for(var i = 0; i < newArray.size; i++) 
{ 
    var min = i; 
    for(var x = i; x < newArray.size; x++) 
    { 
     if(comparator(newArray[min],newArray[x]) == true) 
     { 
      min = x; 
     } 
    } 

    var temp = newArray[i]; 
    newArray[i] = newArray[min]; 
    newArray[min] = temp; 

} 

return newArray; 

} 

我固定的功能:

function sortArr(comparator, array){ 
    /*your code here*/ 
    var i, x; 
    var min; 
    var newArray = array.slice(); 

    for(i = 0; i < newArray.length - 1; i++) 
    { 
     min = i; 
     for(x = i + 1; x < newArray.length; x++) 
     { 
      if(comparator(newArray[min],newArray[x]) == true) 
      { 
       min = x; 
      } 
     } 

     if(min != i){ 
      var temp = newArray[i]; 
      newArray[i] = newArray[min]; 
      newArray[min] = temp; 
     } 

    } 

return newArray; 

} 
+2

它是如何*「不工作」*?我有一種感覺,這個問題不是關於避免原始數組的突變,而是關於爲什麼你的排序算法不起作用。 – Joseph

+0

var newArray = array.slice();'這應該創建一個副本。逐步完成排序算法。 –

+0

我甚至都沒有看到你修改原始數組的方式不能保持它的完整性,我認爲你有算法問題,而不是 - 返回排序的結果 - 問題,請澄清 – AGE

回答

6

複製陣列slice,然後使用本地sort

function sortArr(comparator, array) { 
    return array.slice().sort(function(a,b) { 
    return comparator(a,b) * 2 - 1; 
    }); 
} 
+0

這裏假定'comparator'返回一個布爾值,並將其轉換爲'-1'或'1'。否則,使用'array.slice()。sort(比較器)',而不進行轉換。 – Oriol

0

你的排序算法看起來不完全正確。首先,值的交換應該在if語句中。我還建議看看@ Oriol的解決方案,它更加優雅。

function sortArr(comparator, array){ 

var newArray = array.slice(); 

for(var i = 0; i < newArray.size; i++) 
{ 
    var min = i; 
    for(var x = i; x < newArray.size; x++) 
    { 
     if(comparator(newArray[min],newArray[x]) == true) 
     {     
      var temp = newArray[i]; 
      newArray[i] = newArray[min]; 
      newArray[min] = temp; 
      min = x; 
     } 
    } 
} 

return newArray; 

}