首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据多个条件对数组中的项进行排序

根据多个条件对数组中的项进行排序
EN

Stack Overflow用户
提问于 2017-06-28 19:18:59
回答 3查看 99关注 0票数 4

我有一个正确的分数数组,如下所示:

代码语言:javascript
复制
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"}
]

我已经设法按照homedrawaway对它们进行了排序,但我正在尝试将其扩展到分数,以便它们的顺序保持一致。当我说一致顺序时,我希望对得分进行排序,以便最少数量的目标在数组中排在第一位。接下来,如果有相同的进球数,则应该首先显示主场进球较多的比赛。

目前,我的代码看起来像这样,并且只按homedrawaway排序。我发现很难将这种排序方法扩展到也按分数排序。分数也将不断更新,因此这些分数不必总是与数组中的分数相同。

代码语言:javascript
复制
let order = { HOME: 1, DRAW: 2, AWAY: 3 };

correctScores.sort(function (a, b) { return order[a.code] - order[b.code]; });

我尝试让数组看起来像这样:

代码语言:javascript
复制
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"}

]

关于如何扩展这种排序方法,有人能给我一些建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-28 19:26:55

基本上,您需要为order对象使用较小的键,并且您需要拆分分数以使用值进行排序。

然后,您可以从索引1开始链接增量,并按索引0的增量进行排序。

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

带检查的更新问题的解决方案如果分数不可拆分,则接受一个以Infinite为值的数组,因为它将被排序到底部。

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 5
EN

Stack Overflow用户

发布于 2017-06-28 19:39:39

这样的话

代码语言:javascript
复制
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);

票数 0
EN

Stack Overflow用户

发布于 2017-06-28 19:44:07

包括新的要求:

代码语言:javascript
复制
  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://jsfiddle.net/ct6knnqb/1/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44800963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档