5

一般的な並べ替え関数を作成する必要があります。ソートにはjQueryを使用しています。jQuery の sort 関数は、入力として 2 つのパラメーターのみを受け入れます。しかし、その関数に別のパラメーターを渡したいです。どうやってやるの?

このようなもの:

 obj.sort(StringSort);
 obj2.sort(StringSort);

 function StringSort(a, b, desc)
 {
    var aText = $(a).attr(desc).toLowerCase();
    var bText = $(b).attr(desc).toLowerCase();

    if(aText == bText)
      return 0;

    return aText > bText ? 1 : -1;
 }
4

3 に答える 3

13

関数を返す関数を作成できます。外側の関数は追加の引数を受け入れ、返された関数をソート コールバックとして使用します。

function getStringSort(desc) {
    return function(a, b) {
        // this is a closure, you can access desc here
        // this function should contain your comparison logic or you just 
        // call StringSort here passing a, b  and desc.
    }
}

obj.sort(getStringSort(someValue));

内側の関数は、クロージャー[MDN]であるため、外側の関数のすべてのパラメーターにアクセスできます。

于 2012-10-22T10:30:07.203 に答える
4

jQueryに機能があるとはまったく思いませんsortJavaScript配列に対して行います。jQuery と JavaScript は別物です (一方はライブラリ、もう一方は言語です)。更新: ああ、jQuery には文書化されていないsort(借用しているいくつかの関数の 1 つArray.prototype) がありますが、その事実は文書化されていないため、ドット リリースからドット リリースに変更される可能性があります。ありがとう、フェリックス

3 番目の引数を関数に直接渡すことはできません。渡す関数sortで別の関数を呼び出すことができます。

// ...assuming `desc` is in scope here here...
obj.sort(function(a, b) {
    return StringSort(a, b, desc);
});

比較されるエントリのペアごとに同じものdescが渡されます。もちろん、呼び出しごとに異なります。StringSortab

これが機能するのは、渡されている関数が が定義さsortれているコンテキストに対するクロージャーであるためです。descこれは、関数がアクセスできることを意味しますdesc(関数がグローバル変数にアクセスできるのと同じ理由で)。

閉鎖の詳細:

于 2012-10-22T10:29:28.963 に答える
0

これを試して:

function sortBy(field){
    return function(a, b){
        if (a.field > b.field)
            return -1;
        if (a.field < b.field)
            return 1;
        return 0;
    };
}
于 2014-05-12T03:06:53.607 に答える