基本上,我想构建一个函数,该函数通过对象的属性/成员变量之一对数组中的对象进行排序。我很确定比较器功能是隐藏错误的地方,但我不确定100%。
调用排序函数后,我应该得到的输出是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;
}
compare函数需要两个参数:它应该比较的第一个和第二个元素。因此,您的compareFN应该如下所示:
function compareFN(taskA, taskB) {
return taskA.priority - taskB.priority;
}
编辑:As NPE said,应该执行three-way comparison,因此在这里简单的a < b
不是一个好主意。
您的比较器有多个问题:
task
对象,而不是所比较的对象。尝试:
var compareFN = function(a, b) {
return a.priority - b.priority;
}
您需要更改比较功能的签名以包括两个任务。
对于升序(通常是您想要的),您需要执行b //comperator function
function compareFN(a, b) {
return b.priority < a.priority;
}
比较器函数返回一个负值,零或正值。这三个构成了这里所说的三向比较。所以:'''函数cmp((a,b)=> {// 上升返回a-b}'''对于降序返回b-a