2013-06-29 198 views
2

基本上我想建立一個函數,它通過對象的屬性/成員變量對數組中的對象進行排序。我很確定比較函數是隱藏錯誤的地方,但我不是100%確定的。JavaScript排序比較功能

調用排序功能後應該得到的輸出是1,2,3。我得到1,3,2這意味着它是不變的

這是整個js代碼(有一些評論):

var arr = []; 
//object definition and creation 
var main = document.getElementById("main"); 
var task = { 
    name: "", 
    priority: 0 
}; 

//first 
var one = Object.create(task); 
one.priority = 1; 
//secondd 
var two = Object.create(task) 
two.priority = 3; 
//last 
var three = Object.create(task); 
three.priority = 2; 

//append 
arr.push(one); 
arr.push(two); 
arr.push(three); 

//sort function 
function sortT() { 
    arr.sort(compareFN); 
} 

//comperator function 
function compareFN() { 
    return task.priority < task.priority; 
} 

function print() { 
    for (var i = 0; i < arr.length; i++) { 
     console.log(arr[i].priority); 
    } 
} 

//execution of the program 
print(); 
sortT(); 
print(); 

編輯:該解決方案如下 - 如前所述,比較功能真有問題,把它寫的正確方法如下:

function compareFN(taskA, taskB) { 
    return taskA.priority < taskB.priority; 
} 

回答

6

比較功能需要兩個參數:第一,它應該比較的第二個元素。 所以你compareFN應該是這樣的:

function compareFN(taskA, taskB) { 
    return taskA.priority - taskB.priority; 
} 

編輯:As NPE said,它應該執行three-way comparison,所以一個簡單的a < b不是那麼這裏一個偉大的想法。

+0

這是後到前,你會得到3,2,1 – dougajmcdonald

+0

這種比較是錯誤的;請參閱NPE的答案以獲得正確的解決方案。 [MDN排序參考](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) –

5

有多種問題,您比較:

  1. 它引用全局對象task而不是被比較的對象。
  2. 它將對象與自身進行比較。它應該執行three-way comparison

嘗試:

var compareFN = function(a, b) { 
    return a.priority - b.priority; 
} 
0

您需要更改您的比較函數的簽名以包含這兩個任務。

按升序排列(你想要什麼正常),你需要做B <一個,一個< B就做降序排列

//comperator function 
function compareFN(a, b) { 
    return b.priority < a.priority; 
}