JavaScript排序比较函数

7

基本上我想要构建一个函数,根据对象的一个属性/成员变量对数组中的对象进行排序。我非常确定比较函数是隐藏错误的地方,但我不是百分之百确定。

调用排序函数后,我应该得到的输出结果是1,2,3。但我得到的是1,3,2,这意味着它没有改变。

这是整个JavaScript代码(带一些注释):

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个回答

9

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

  1. 它引用全局的 task 对象而不是被比较的对象。
  2. 它将对象与自身进行比较。
  3. 它应该执行 三路比较

尝试如下:

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

9
比较函数需要两个参数:要进行比较的第一个元素和第二个元素。所以你的比较函数应该像这样:
```javascript function compareFN(firstElement, secondElement) { // 比较逻辑 } ```
function compareFN(taskA, taskB) {
   return taskA.priority - taskB.priority;
}

编辑: 正如NPE所说,它应该执行一个三向比较,所以简单的a < b在这里并不是一个好主意。


这是反向的,你会得到3,2,1。 - dougajmcdonald
那个比较是错误的;请参考NPE的答案获取正确的解决方案。MDN排序参考 - Michael Geary

1
你需要更改比较函数的签名,以包括这两个任务。
对于升序(通常是您想要的),您需要执行 b < a,a < b 将执行降序。
//comperator function
function compareFN(a, b) {
    return b.priority < a.priority;
}

1
比较函数返回负值、零或正值,这三种情况被称为三路比较。因此: ''' function cmp((a, b) => { // 升序 return a - b } ''' 要降序,返回 b - a。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接