2013-06-29 146 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; 
}