我有一个正确的分数数组,如下所示:
var correctScores = [
{score: "2-2", code: "draw"},
{score: "2-1", code: "home"},
{score: "0-1", code: "away"},
{score: "1-0", code: "home"},
{score: "3-0", code: "home"},
{score: "any home win", code: "home"},
{score: "1-2", code: "away"},
{score: "0-3", code: "away"},
{score: "any draw", code: "draw"},
{score: "0-0", code: "draw"},
{score: "any away win", code: "away"},
{score: "0-2", code: "away"},
{score: "1-1", code: "draw"},
{score: "2-0", code: "home"}
]我已经设法按照home、draw、away对它们进行了排序,但我正在尝试将其扩展到分数,以便它们的顺序保持一致。当我说一致顺序时,我希望对得分进行排序,以便最少数量的目标在数组中排在第一位。接下来,如果有相同的进球数,则应该首先显示主场进球较多的比赛。
目前,我的代码看起来像这样,并且只按home、draw、away排序。我发现很难将这种排序方法扩展到也按分数排序。分数也将不断更新,因此这些分数不必总是与数组中的分数相同。
let order = { HOME: 1, DRAW: 2, AWAY: 3 };
correctScores.sort(function (a, b) { return order[a.code] - order[b.code]; });我尝试让数组看起来像这样:
var correctScores = [
{score: "1-0", code: "home"},
{score: "2-0", code: "home"},
{score: "3-0", code: "home"},
{score: "2-1", code: "home"},
{score: "any home win", code: "home"}
{score: "0-0", code: "draw"},
{score: "1-1", code: "draw"},
{score: "2-2", code: "draw"},
{score: "any draw", code: "draw"},
{score: "0-1", code: "away"},
{score: "0-2", code: "away"},
{score: "0-3", code: "away"},
{score: "1-2", code: "away"},
{score: "any away win", code: "away"}
]关于如何扩展这种排序方法,有人能给我一些建议吗?
发布于 2017-06-28 19:26:55
基本上,您需要为order对象使用较小的键,并且您需要拆分分数以使用值进行排序。
然后,您可以从索引1开始链接增量,并按索引0的增量进行排序。
var correctScores = [{ score: "2-2", code: "draw" }, { score: "2-1", code: "home" }, { score: "0-1", code: "away" }, { score: "1-0", code: "home" }, { score: "3-0", code: "home" }, { score: "1-2", code: "away" }, { score: "0-3", code: "away" }, { score: "0-0", code: "draw" }, { score: "0-2", code: "away" }, { score: "1-1", code: "draw" }, { score: "2-0", code: "home" }],
order = { home: 1, draw: 2, away: 3 };
correctScores.sort(function (a, b) {
function getParts(s) { return s.split('-'); }
var aa = getParts(a.score),
bb = getParts(b.score);
return order[a.code] - order[b.code] || aa[1] - bb[1] || aa[0] - bb[0];
});
console.log(correctScores);.as-console-wrapper { max-height: 100% !important; top: 0; }
带检查的更新问题的解决方案如果分数不可拆分,则接受一个以Infinite为值的数组,因为它将被排序到底部。
var correctScores = [{ score: "2-2", code: "draw" }, { score: "2-1", code: "home" }, { score: "0-1", code: "away" }, { score: "1-0", code: "home" }, { score: "3-0", code: "home" }, { score: "any home win", code: "home" }, { score: "1-2", code: "away" }, { score: "0-3", code: "away" }, { score: "any draw", code: "draw" }, { score: "0-0", code: "draw" }, { score: "Any away win", code: "away" }, { score: "0-2", code: "away" }, { score: "1-1", code: "draw" }, { score: "2-0", code: "home" }],
order = { home: 1, draw: 2, away: 3 };
correctScores.sort(function (a, b) {
function getParts(s) {
var t = s.split('-');
return t.length === 1 ? [Infinity, Infinity] : t;
}
var aa = getParts(a.score),
bb = getParts(b.score);
return order[a.code] - order[b.code] || aa[1] - bb[1] || aa[0] - bb[0];
});
console.log(correctScores);.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2017-06-28 19:39:39
这样的话
var correctScores = [
{score: "2-1", code: "home"},
{score: "1-0", code: "home"},
{score: "3-0", code: "home"},
{score: "2-0", code: "home"},
{score: "1-1", code: "draw"},
{score: "0-0", code: "draw"},
{score: "2-2", code: "draw"},
{score: "0-3", code: "away"},
{score: "0-2", code: "away"},
{score: "0-1", code: "away"},
{score: "1-2", code: "away"}
];
var groups = {};
var scores = [];
correctScores.map(function(e) {
groups[e.code] = groups[e.code] || [];
groups[e.code].push(e);
});
for(var i in groups) {
groups[i].sort(function (a, b) {
var scoreA = a.score.split('-').map(Number);
var scoreB = b.score.split('-').map(Number);
return scoreA[0]+scoreA[1] > scoreB[0]+scoreB[1] ? 1:(
scoreA[0]+scoreA[1] < scoreB[0]+scoreB[1] ? -1:0);
});
scores = scores.concat(groups[i]);
}
console.log(scores);
发布于 2017-06-28 19:44:07
包括新的要求:
var correctScores = [
{score: "2-2", code: "draw"},
{score: "2-1", code: "home"},
{score: "0-1", code: "away"},
{score: "1-0", code: "home"},
{score: "3-0", code: "home"},
{score: "Any home win", code: "home"},
{score: "1-2", code: "away"},
{score: "0-3", code: "away"},
{score: "any draw", code: "draw"},
{score: "0-0", code: "draw"},
{score: "Any away win", code: "away"},
{score: "0-2", code: "away"},
{score: "1-1", code: "draw"},
{score: "2-0", code: "home"}
];
let order = { home: 1, draw: 2, away: 3 };
correctScores.sort(function (a, b) {
s1 = parseInt(a.score.split("-")[0]);
s2 = parseInt(b.score.split("-")[0]);
s1s = s1+parseInt(a.score.split("-")[1]);
s2s = s2+parseInt(b.score.split("-")[1]);
if(a.score.toLowerCase().indexOf("any")>-1){s1=999;s1s=999;}
if(b.score.toLowerCase().indexOf("any")>-1){s2=999;s2s=999;}
if(order[a.code]<order[b.code]) return -1;
if(order[a.code]>order[b.code]) return 1;
if(s1s<s2s) return -1;
if(s1s>s2s) return 1;
if(s1>s2) return -1;
if(s1<s2) return 1;
});
console.log(correctScores);https://stackoverflow.com/questions/44800963
复制相似问题