首页 > 解决方案 > 按两个数字项对二维数组进行排序

问题描述

我想先按第 5 列,然后按第 4 列对 2D 数组进行排序。它们代表足球联赛表上的 PTS 和 GD。

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

我已经修改了我在论坛上收到的很好的建议: 按数字项排序 2D 数组

我复制了该函数,使其首先按 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 ] ]

这似乎是最笨拙的解决方案。在单个函数中实现这一目标的最佳方法是什么?提前致谢。

标签: javascriptarrayssortingcolumnsorting

解决方案


您可以链接订单函数,直到您将此值返回给排序函数时有所不同。

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; }


推荐阅读