JavaScript
sort

JSでcmp関数を定義してsortを読みやすく書く技

JavaScript で sort を書く場合、普通なら次のように書く。

ary = ary.sort(function (a, b) {
    var _a, _b;
    _a = a['Instance Family'].replace(/General purpose/, '');
    _b = b['Instance Family'].replace(/General purpose/, '');
    if (_a !== _b) return _a < _b ? -1 : 1;
    _a = a['vCPU'] * 1;
    _b = b['vCPU'] * 1;
    if (_a !== _b) return _a > _b ? -1 : 1;
    _a = a['Memory'].replace(/ .*$/, '').replace(/,/g, '') * 1;
    _b = b['Memory'].replace(/ .*$/, '').replace(/,/g, '') * 1;
    if (_a !== _b) return _a < _b ? -1 : 1;
    return 0;
});

次のようにすると、これがもっと解りやすく書ける。

まずは cmp という関数を定義。

function cmp(a, b, func) {
  a = func(a);
  b = func(b);
  if (a === b) return 0;
  return a < b ? -1 : 1;
}

すると、先ほどんのロジックは次のように書ける。

ary = ary.sort(function (a, b) {
  return false ||
    cmp(a, b, function (v) { return v['Instance Family'].replace(/General purpose/, '') } ||
    cmp(b, a, function (v) { return v['vCPU'] * 1 } ||
    cmp(a, b, function (v) { return v['Memory'].replace(/ .*$/, '').replace(/,/g, '') * 1 } ||
    0;
});

比較ロジックが見えやすくなる。