javascript - 按两个数字项对二维数组进行排序
问题描述
我想先按第 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 ] ]
这似乎是最笨拙的解决方案。在单个函数中实现这一目标的最佳方法是什么?提前致谢。
解决方案
您可以链接订单函数,直到您将此值返回给排序函数时有所不同。
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; }
推荐阅读
- webhooks - Can I prepare trigger action in Choreograph for Pepper?
- c++ - What's better? Return a list of object pointers? or Return a pointer to list of objects?
- amazon-web-services - AWS Sample Template: S3_Website_With_CloudFront_Distribution.template Fails Upon Start do to Route 53 Domain Name
- java - 如何在hibernate中使用作为另一个表的复合主键的部分外键作为主键?
- c# - 为什么对象 a 不在当前上下文中?
- angular - Angular 显示缓存数据并在后台需要数据时更新新数据
- python - 递归执行问题 | Python
- javascript - 最后变量中的意外值
- python - 在 ipdb 会话中如何使用 list()?
- r - 使用 httr 使用 R 进行 OAuth2 身份验证