Сортировка 2D массива по двум числовым элементам - PullRequest
1 голос
/ 26 мая 2019

Я хочу отсортировать двумерный массив сначала по столбцу 5, а затем по столбцу 4. Они представляют PTS и GD в таблице футбольной лиги.

var table = [
  ["teamA", 6, 2, 0, 2, 7],
  ["teamB", 6, 1, 1, 6, 7],
  ["teamC", 6, 2, 1, 8, 7]
];

Я адаптировал отличный совет, полученный на форуме: Сортировка двумерного массива по числовому элементу

Я реплицировал функцию так, чтобы она сначала сортировалась по PTS, а затем по GD.

console.log(table.sort(comparePTS));

console.log(table.sort(compareGD));

function comparePTS(a, b) {
  return b[5] - a[5]

}
function compareGD(a, b) {
  return b[4] - a[4]
}

Хотя это работает, таблица отображается дважды:

Сортировка по PTS

[ [ "teamA", 6, 2, 0, 2, 7 ], [ "teamB", 6, 1, 1, 6, 7 ], [ "teamC", 6, 2, 1, 8, 7 ] ]

Сортировка по PTS и GD

[ [ "teamC", 6, 2, 1, 8, 7 ], [ "teamB", 6, 1, 1, 6, 7 ], [ "teamA", 6, 2, 0, 2, 7 ] ]

И это кажется самым неуклюжим решением. Каков наилучший способ достичь этого с помощью одной функции? Заранее спасибо.

1 Ответ

0 голосов
/ 26 мая 2019

Вы можете связать функции заказа, пока у вас не будет разницы для возврата этого значения в функцию сортировки.

const
    PTS = a => a[5],
    GD = a => a[4],
    ASC = fn => (a, b) => fn(a) - fn(b),
    DESC = fn => (a, b) => fn(b) - fn(a),
    sortBy = fns => (a, b) => {
        var value;
        fns.some(fn => value = fn(a, b));
        return value;
    };

var table = [["teamA", 6, 2, 0, 2, 7], ["teamB", 6, 1, 1, 6, 7], ["teamC", 6, 2, 1, 8, 7]];
   
table.sort(sortBy([DESC(PTS), DESC(GD)]));

console.log(table);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...