1. ホーム
  2. javascript

javascriptのarray.sort()メソッドを拡張して別のパラメータを受け付ける方法はありますか?

2023-10-21 02:36:43

質問

オブジェクトの配列をソートしようとしています。各属性のカスタムソートメソッドを書かないほうがいいと思うのですが。

どうにかして、組み込みの array.sort() メソッドを拡張して、ソートする属性を記述する追加パラメータを 受け付けることはできますか?例えば

array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');

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

プロパティ名を受け付けるファンクションジェネレータを書きましょう。

function propComparator(prop) {
    return function(a, b) {
        return a[prop] - b[prop];
    }
}

arr.sort(propComparator('name'));

また、ソーターを後で使うために、直接、またはパラメーターとして保存することができます。

var compareNames = propComparator('name');
var compareFoos = propComparator('foo');
...
arr.sort(compareNames);
takesComparator(compareFoos);

ES6用に更新し、異なる型でも実際に動作するようにしました。

注意点として sort はインプレースでソートすることに注意してください。

const arr = [
  { name: 'John', age: 92 },
  { name: 'Dave', age: 42 },
  { name: 'Justin', age: 3 }
]

const propComparator = (propName) =>
  (a, b) => a[propName] == b[propName] ? 0 : a[propName] < b[propName] ? -1 : 1

arr.sort(propComparator('name'))
console.log("By name", arr)

arr.sort(propComparator('age'))
console.log("By age", arr)