質問: [ { first_nom: 'lazslo', last_nom: 'jamf' }, { first_nom: 'pig', last_nom: 'bodine' }, { first_nom: 'pirate', last_nom: 'prentice' } ]; javascriptのlast_nomの値で並べ替えるにはどうすればよいですか。私はsort(a,b)については知っていますが、それは文字列と数値に対してのみ働くようです。オブジェクトにtostring()メソッドを追加する必要がありますか?
回答: この特定のアプローチが提案されているのを見たことがないので、stringとnumberの両方で機能する簡潔な比較方法を以下に示します。 const objs = [ { first_nom: 'lazslo', last_nom: 'jamf' }, { first_nom: 'pig', last_nom: 'bodine' }, { first_nom: 'pirate', last_nom: 'prentice' } ]; const sortby = fn => (a, b) => { const fa = fn(a) const fb = fn(b) return -(fa < fb) || +(fa > fb) } const getlastname = o => o.last_nom const sortbylastname = sortby(getlastname) objs.sort(sortbylastname) console.log(objs.map(getlastname)) sortby()の説明は次のとおりです。sortby()は、比較として使用するオブジェクトの値を選択するfnを受け入れ、array.prototype.sort()に直接渡すことができる関数を返します。この例では、比較の値としてo.last_nomを使用しているため、array.prototype.sort()を介して2つのオブジェクトを受け取るときは常に{ first_nom: 'lazslo', last_nom: 'jamf' } そして{ first_nom: 'pig', last_nom: 'bodine' } を使用しております(a, b) => { const fa = fn(a) const fb = fn(b) return -(fa < fb) || +(fa > fb) } それらを比較します。fn = o => o.last_nomを思い出して、比較関数を同等のものに拡張できます。(a, b) => { const fa = a.last_nom const fb = b.last_nom return -(fa < fb) || +(fa > fb) } 論理or ||演算子には、ここで非常に役立つ短絡機能があります。それがどのように機能するかのために、上記の関数の本体はif (fa < fb) return -1 return +(fa > fb) fa < fbの場合は-1を返し、そうでない場合はfa > fbの場合は+1を返しますが、fa == fbの場合はfa < fbおよびfa > fbはfalseであるため、+0を返します。追加のボーナスとして、矢印関数のないecmascript 5に相当するものがありますが、残念ながらこれはより冗長です。 var objs = [ { first_nom: 'lazslo', last_nom: 'jamf' }, { first_nom: 'pig', last_nom: 'bodine' }, { first_nom: 'pirate', last_nom: 'prentice' } ]; var sortby = function (fn) { return function (a, b) { var fa = fn(a) var fb = fn(b) return -(fa < fb) || +(fa > fb) } } var getlastname = function (o) { return o.last_nom } var sortbylastname = sortby(getlastname) objs.sort(sortbylastname) console.log(objs.map(getlastname))