4

基本的に、オブジェクトのプロパティ/メンバー変数のいずれかで配列内のオブジェクトを並べ替える関数を作成したいと考えています。エラーが隠されているのは比較機能にあると確信していますが、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

4 に答える 4

8

コンパレータには複数の問題があります。

  1. 比較対象のオブジェクトではなく、グローバルtaskオブジェクトを参照します。
  2. オブジェクトをそれ自体と比較します。
  3. 3 者間比較を実行することになっています。

試す:

var compareFN = function(a, b) {
    return a.priority - b.priority;
}
于 2013-06-29T16:08:12.293 に答える
7

比較関数には 2 つの引数が必要です。比較する最初の要素と 2 番目の要素です。したがって、compareFN は次のようになります。

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

編集: NPE が言ったように、 3 者間比較を実行することになっているため、ここでは単純なa < bものはそれほど優れたアイデアではありません。

于 2013-06-29T16:08:54.390 に答える