1. ホーム
  2. javascript

[解決済み] Underscore: 複数の属性に基づくsortBy()

2022-09-04 19:07:58

質問

複数の属性に基づいたオブジェクトの配列をソートしようとしています。すなわち、最初の属性が2つのオブジェクト間で同じである場合、2番目の属性は2つのオブジェクトを比較するために使用されるべきです。たとえば、次のような配列を考えてみましょう。

var patients = [
             [{name: 'John', roomNumber: 1, bedNumber: 1}],
             [{name: 'Lisa', roomNumber: 1, bedNumber: 2}],
             [{name: 'Chris', roomNumber: 2, bedNumber: 1}],
             [{name: 'Omar', roomNumber: 3, bedNumber: 1}]
               ];

これらを並べ替えるには roomNumber 属性でソートするには、次のコードを使用します。

var sortedArray = _.sortBy(patients, function(patient) {
    return patient[0].roomNumber;
});

これはうまくいきますが、'John' と 'Lisa' が適切にソートされるようにするにはどうしたらよいでしょうか?

どのように解決するのですか?

sortBy によると、安定ソートアルゴリズムなので、このように最初に2番目のプロパティでソートし、次に最初のプロパティで再びソートすることができるはずです。

var sortedArray = _(patients).chain().sortBy(function(patient) {
    return patient[0].name;
}).sortBy(function(patient) {
    return patient[0].roomNumber;
}).value();

2番目の sortBy が John と Lisa が同じ部屋番号であることを発見した場合、 彼らを発見した順番に並べますが、最初の sortBy は "リサ、ジョン" に設定されます。