簡體   English   中英

JavaScript 排序比較器函數

[英]JavaScript sort comparator function

基本上我想構建一個函數,通過對象的屬性/成員變量之一對數組中的對象進行排序。 我很確定比較器函數是隱藏錯誤的地方,但我不是 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;
}

您的比較器存在多個問題:

  1. 它指的是全局task對象而不是被比較的對象。
  2. 它將對象與自身進行比較。
  3. 它應該執行三向比較

嘗試:

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

compare 函數需要兩個參數:它應該比較的第一個和第二個元素。 所以你的 compareFN 應該是這樣的:

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

編輯:正如 NPE 所說,它應該執行三向比較,所以簡單的a < b在這里並不是一個好主意。

您需要更改比較函數的簽名以包含這兩個任務。

對於升序(通常是您想要的),您需要執行 b < a,a < b 將執行降序

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

比較器函數返回負值、零或正值。 這三個構成了這里所說的三向比較。 所以: ''' function cmp((a, b) => { // 升序返回 a - b } ''' 降序返回 b - a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM