JavaScript sort comparator function

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

Basically I want to build a function which sorts objects in an array by one of the object's properties/member variables. I am preeeety sure that the comparator function is where the error is hidden, but I am not 100% sure.

The output I should get after the sort function is called is 1,2,3. I get 1,3,2 which means that it is unchanged

This is the entire js code (with some comments):

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(); 

EDIT: The solution is the following - As stated, the comparator function really was the problem, the correct way to write it is the following:

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

回答1:

The compare function needs two arguments: the first and the second element it should compare. So your compareFN should look like this:

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

Edit: As NPE said, it is supposed to perform a three-way comparison, so a simple a < b is not so a great idea here.



回答2:

There are multiple problems with your comparator:

  1. It refers to the global task object instead of the objects being compared.
  2. It compares the object to itself.
  3. It is supposed to perform a three-way comparison.

Try:

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


回答3:

You need to change the signature of you compare function to include the two tasks.

For ascending order (normally what you want) you need to do b < a, a < b will do descending order

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!