【问题标题】:Fine sorting array of objects in JavaScript [closed]JavaScript中的对象数组精细排序[关闭]
【发布时间】:2013-12-30 11:58:13
【问题描述】:

我有一个代表曲棍球排名数据的对象数组:

[
  {
     name: "Russia",
     points: 10,
     iihf: 1
  },
  {
     name: "USA",
     points: 10,
     iihf: 7
  },
  {
     name: "Slovakia",
     points: 8,
     iihf: 6
  }
]

我想从最高分开始对数据进行降序排序。如果两个或多个团队共享相同的积分,则必须使用下一个维度对其进行精细排序,即 IIHF 排名(升序)。有没有优雅的解决方案?

谢谢。

【问题讨论】:

  • 你尝试/搜索了什么?
  • 我觉得this answer 很优雅;]
  • @thg435 - 可能是因为它是你自己的?
  • @DontVoteMeDown 我已经完成了一个简单的 fn 作为按维度名称排序的排序参数,但我无法理解如何在对等号进行精细排序的同时保持原始排序不变。以为我必须提取等号,对它们进行排序,然后将它们放回原始排序中。不知道我是否可以用一种不太复杂的方式来做这件事,因此提出了这个问题。

标签: javascript arrays sorting


【解决方案1】:

另外:如果您知道 iihf 分数的上限,您还可以预先计算一个复合分数,仅用于排序。复合分数可能如下所示:

obj.cscore = obj.points * 10000 + obj.iihf;

之后,你可以在 cscore 之后排序:

arr.sort(function(a,b) { 
    return a.cscore - b.cscore;
});

如果您不想污染原始对象,可以使用临时地图(如here 所述):

var map = arr.map(function (e, i) {
    return {index: i, cscore: e.points * 1000 + e.iihf};
});

map.sort(function (a,b) {
    return a.cscore - b.cscore;
});

var result = map.map(function(e){
  return arr[e.index]
});

FIDDLE

【讨论】:

  • return a.cscore < b.cscore ? 1 : -1 不正确-您缺少相等的大小写。比较数字的一种优雅方法是返回它们的差异:return a.score - b.score。
  • @thg435 谢谢,你是对的。我实际上是从 adeneo 的答案中漫不经心地复制了这部分(它也不返回零)。不管怎样,我修好了。
  • 太棒了!现在下一步:由于两个排序字段都是数字,您可以使用布尔值或:return b.points - a.points || a.iihf - b.iihf 组合它们 - 不需要复合键。
  • @thg435 这是解决此问题的一种非常漂亮且简单的方法。您为什么不将其发布为答案?我的目标是介绍复合键的一般概念。我意识到在这种特殊情况下,它可能没有必要,但它是解决问题的一种方法。
  • 是的,施瓦茨变换是值得了解的有用技术。干得好!
【解决方案2】:

使用Array.sort(),如果points的值相等,则按iihf排序

arr.sort(function(a,b) {
    if (a.points == b.points) return a.iihf > b.iihf ? 1 : -1;    
    return a.points < b.points ? 1 : -1;
});

FIDDLE

【讨论】:

  • 漂亮,谢谢。
【解决方案3】:

试试这个

function comparator(a, b) {
   if (a.points == b.points) return a.iihf > b.iihf ? 1 : -1;    
return a.points < b.points ? 1 : -1;
}

var json = { "homes": 
             [
  {
     name: "Russia",
     points: 10,
     iihf: 1
  },
  {
     name: "USA",
     points: 10,
     iihf: 7
  },
  {
     name: "Slovakia",
     points: 8,
     iihf: 6
  }
]};
console.log(json["homes"].sort(comparator));

DEMO

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2021-12-15
    • 2021-11-25
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多