15

カスタマイズされた方法で配列をソートしたいと思います。

例は学生のクラスレベルです:

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){  
    // ??  
})

理想的には、並べ替えは次を返す必要があります。

["Freshman","Sophomore","Junior","Senior"]

次のように、クラスレベルを事前にランク付けできるかどうかを考えています。

var classlevelRanked = [{ class: "Junior",
   rank: 3
 },{ class: "Senior",
   rank: 4
 },{ class: "Freshman",
   rank: 1
 },{ class: "Sophomore",
   rank: 2
 }]

次に、次の方法で並べ替えを適用します。

_.sortBy(classlevelRanked, function(classlevel){  
  return classlevel.rank;  
})

しかし、次のようにしてランクを取り除く必要があります。

.map(function(classlevel){  
    return classlevel["class"];  
})

クラスレベルを事前にランク付けしてから後で削除することなく、これを行うより直接的な方法はありますか?

ありがとうございました。

4

4 に答える 4

55

次のようなことができるはずです。

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){  
    var rank = {
        "Junior" : 3,
        "Senior" : 4,
        "Freshman" :1,
        "Sophomore" :2
    };

    return rank[element];
});

フィドル:

http://jsfiddle.net/hKQj8/


あるいは、rankが他の場所で役立つ可能性のある定数である場合は、_.sortBy式の外で定義し_.propertyOfて、より宣言的なスタイルに使用できます。

var rank = {
    "Junior" : 3,
    "Senior" : 4,
    "Freshman" :1,
    "Sophomore" :2
};

_.sortBy(["Junior","Senior","Freshman","Sophomore"], _.propertyOf(rank));
于 2013-05-30T22:11:57.027 に答える
12

ジェイソンの答えに加えて:

var list = _.sortBy([{name:"Junior"},{name:"Senior"},{name:"Freshman"},{name:"Sophomore"}], function(element){  
    var rank = {
        "Junior" : 3,
        "Senior" : 4,
        "Freshman" :1,
        "Sophomore" :2
    };

    return rank[element.name];
});

 console.dir(list);

オブジェクトの配列をソートするのに役立ちます

于 2013-09-10T15:03:51.047 に答える
3

それを超ハック/悪い方法で実行してください!!!! 非常に単純/めちゃくちゃ混乱します:)

function rank(word){
    return Math.abs(113-word.trim().toLowerCase().charCodeAt(1));
}

console.log(rank('freshman')); // 1
console.log(rank('sophomore')); // 2
console.log(rank('junior')); // 4
console.log(rank('senior')); // 12

編集:

人々はこの回答が有用であると考えているように見えるので、これがどのように機能するかを説明します...提供された単語の1文字に基づいてソートされます。"sophomore" と "senior" は最初の文字が重複しているため、2 番目の文字で並べ替えることにしました。各単語には固有の値があります。

これにより、sEnior、sOphomore、fReshman、jUnior の順序になります。それらを適切にソートするために、R(新入生用)のすぐ隣にあるQ(113)の文字コードを使用して減算しました。つまり、各単語の 2 番目の文字が Q にどれだけ近いかによって順序が決まります。負の数を防ぐために、関数は結果の絶対値を取り、それを返します。

于 2013-05-30T22:52:37.237 に答える