gpt4 book ai didi

javascript - 如何对包含表示分数的数组的多个对象进行排序?

转载 作者:行者123 更新时间:2023-11-28 01:30:40 26 4
gpt4 key购买 nike

给定一个像这样的对象数组:

competitors = [{
name: "Alice",
scores: [3,7,8,2,5]
}, {
name: "Bob",
scores: [4,4,5,6,8]
}, {
name: "Carol",
scores: [5,3,2,7,6]
}];

鉴于分数越低越好,我如何对它们进行排序(将它们排名 1-3),以便获胜者是在每个索引中赢得最多比较的人?

例如,对于 Alice、Bob 和 Carol,Alice 应该获胜,因为在可能的 5 场胜利中,她有 3 场胜利 (3<4<5, 2<6<7, 5<6<8)。

一个更复杂的例子是

competitors = [{
name: "Dave",
scores: [8,1,1,8,4]
}, {
name: "Eve",
scores: [1,5,4,5,2]
}, {
name: "Frank",
scores: [6,2,3,4,7]
}];

这里,Frank 输了(1 胜:4<5<8),而 Dave(2 胜:1<2<5, 1<3<4)和 Eve(2 胜:1<6<8, 2< 4<7) 平局。因此,只要戴夫和夏娃重复这个过程,你就可以打破平局。伊芙以3胜2负的成绩赢得决胜局。最终排名是Eve、Dave、Frank。

我总是会提前知道每个参赛者的分数(让我们称之为numJudges),以及可能的分数范围(让我们称之为1-numCompetitors)。除了 webkit 的 javascript 引擎之外,我也不关心浏览器支持,因此这意味着支持 ECMAScript 5 和一些 6 ( es5-compat-table ),例如数组函数 everyma​​p过滤减少

最佳答案

我发现它通常有助于将这样的大任务分解为多个阶段。我怀疑它是否有效,但它可能对你有用。

开始:获取一个包含每个竞争对手结果的数组:

function getScores() {
return competitors.map(function (el) {
return el.scores;
});
}

var scores = getScores();

然后拉出个人游戏信息:

function getGames(scores) {
var games = [];
for (var i = 0, l = scores[0].length; i < l; i++) {
games.push(scores.map(function (el) {
return el[i];
}));
}
return games;
}

var games = getGames(scores);

找出每场比赛的获胜者:

function findWinners(games) {
return games.map(function (el) {
return el.indexOf(Math.min.apply(null, el));
});
}

var winners = findWinners(games);

最后,向每位参赛者更新他们的结果。

function applyWinners(winners) {
winners.forEach(function (el, i) {
var competitor = competitors[el];
if (!competitor.results) competitor.results = [];
competitor.results.push(i);
});
}

applyWinners(winners);

console.log(competitors) // Alice wins [0, 3, 4], Carol wins [1, 2]

Fiddle

关于javascript - 如何对包含表示分数的数组的多个对象进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com