JavaScript排序比较器功能

时间:2013-06-29 16:05:06

标签: javascript

基本上我想构建一个函数,它通过对象的属性/成员变量之一对数组中的对象进行排序。我确信比较器功能是隐藏错误的地方,但我不是100%肯定。

调用sort函数后我得到的输出是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;
}

4 个答案:

答案 0 :(得分:7)

compare函数需要两个参数:它应该比较的第一个和第二个元素。 所以你的compareFN应该是这样的:

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

修改:As NPE said,它应该执行three-way comparison,所以简单的a < b在这里不是一个好主意。

答案 1 :(得分:5)

您的比较器存在多个问题:

  1. 它指的是全局task对象,而不是被比较的对象。
  2. 它将对象与自身进行比较。
  3. 应该执行three-way comparison
  4. 尝试:

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

答案 2 :(得分:0)

您需要更改比较功能的签名以包含两个任务。

对于升序(通常是你想要的)你需要做b&lt; a,a&lt; b将按降序排列

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

答案 3 :(得分:0)

比较器函数返回负值,零或正值。这三个构成了这里所说的三向比较。 所以: ''' 函数cmp((a,b)=> { // 上升 返回a-b } ''' 对于降序返回b-a