排序多个属性的对象的数组 [英] Sort an array of objects by multiple properties

查看:113
本文介绍了排序多个属性的对象的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有对象,像这样的数组:

  VAR一个= [
    {ID:1,比分:1,isCut:假的,地下城与勇士:假},
    {ID:2,比分:2,isCut:假的,地下城与勇士:假},
    {ID:3,比分:3,isCut:假的,地下城与勇士:假},
    {ID:4,比分:4,isCut:假的,地下城与勇士:假},
    {ID:5,得分:5,isCut:真的,DNF:真正},
    {ID:6,得分:6,isCut:真的,DNF:假},
    {ID:7,得分:7,isCut:真的,DNF:假},
    {ID:8,得分:8,isCut:真的,DNF:假},
    {ID:9,得分:9,isCut:真的,DNF:假},
    {ID:10,比分:0,isCut:假的,地下城与勇士:假},
    {ID:11,比分:-1,isCut:假的,地下城与勇士:假},
    {ID:12,比分:-2,isCut:假的,地下城与勇士:真正},
    {ID:13,比分:-3,isCut:假的,地下城与勇士:假},
    {ID:14,比分:-4,isCut:假的,地下城与勇士:假},
    {ID:15,比分:-5,isCut:假的,地下城与勇士:假},
    {ID:16分:10,isCut:真的,DNF:假}
];

我需要组并通过以下标准对数组进行排序:


  1. 如果 DNF 为真,对象进入底部;所有的 DNF -objects应该按分数进行排序

  2. 如果 isCut 为真,目的去底部,但上面的 DNF S;所有的 isCut -objects应该按分数进行排序

  3. 其余部分应该由评分排序,如果分数相等,由 ID


解决方案

(更新)下面是你在评论中提及了问题的答案。

  a.sort(功能(A,B){
  如果(a.dnf!= b.dnf){
    返回a.dnf? 1:-1;
  }
  如果((a.dnf&放大器;!&放大器; b.dnf)及&放大器;!a.isCut = b.isCut){
    返回a.isCut? 1:-1;
  }
  如果(a.score!= b.score){
    返回b.score - a.score; //下降
  }
  返回b.id - a.id; //下降
});

结果:

  [
  {ID:4,分数:4,isCut:假的,地下城与勇士:虚假} //剩下的:为了通过分数,身份证
  {ID:3,分数:3,isCut:假的,地下城与勇士:虚假} //
  {ID:2,得分:2,isCut:假的,地下城与勇士:虚假} //
  {ID:1,分数:1,isCut:假的,地下城与勇士:虚假} //
  {ID:10,得分:0,isCut:假的,地下城与勇士:虚假} //
  {ID:11,得分: - 1,isCut:假的,地下城与勇士:虚假} //
  {ID:13,得分 - 3isCut:假的,地下城与勇士:虚假} //
  {ID:14,得分 - 4isCut:假的,地下城与勇士:虚假} //
  {ID:15,得分 - 5isCut:假的,地下城与勇士:虚假} //
  {ID:16,得分:10,isCut:真实的地下城与勇士:虚假} // isCut:为了按分数,身份证
  {ID:9,得分:9,isCut:真实的地下城与勇士:虚假} //
  {ID:8,得分:8,isCut:真实的地下城与勇士:虚假} //
  {ID:7,分数:7,isCut:真实的地下城与勇士:虚假} //
  {ID:6,分数:6,isCut:真实的地下城与勇士:虚假} //
  {ID:5,分数:5,isCut:真实的地下城与勇士:真正} //地下城与勇士:为了按分数,身份证
  {ID:12,得分 - 2,isCut:假的,地下城与勇士:真正} //
]

I have an array of objects like this:

var a = [
    { id: 1, score: 1, isCut: false, dnf: false },
    { id: 2, score: 2, isCut: false, dnf: false },
    { id: 3, score: 3, isCut: false, dnf: false },
    { id: 4, score: 4, isCut: false, dnf: false },
    { id: 5, score: 5, isCut: true, dnf: true },
    { id: 6, score: 6, isCut: true, dnf: false },
    { id: 7, score: 7, isCut: true, dnf: false },
    { id: 8, score: 8, isCut: true, dnf: false },
    { id: 9, score: 9, isCut: true, dnf: false },
    { id: 10, score: 0, isCut: false, dnf: false },
    { id: 11, score: -1, isCut: false, dnf: false },
    { id: 12, score: -2, isCut: false, dnf: true },
    { id: 13, score: -3, isCut: false, dnf: false },
    { id: 14, score: -4, isCut: false, dnf: false },
    { id: 15, score: -5, isCut: false, dnf: false },
    { id: 16, score: 10, isCut: true, dnf: false }
];

I need to group and sort the array by the following criteria:

  1. if dnf is true, object goes to bottom; all dnf-objects should be sorted by score
  2. if isCut is true, object goes to bottom, but above dnfs; all isCut-objects should be sorted by score
  3. rest should be sorted by score, and if the scores are equal, by id

解决方案

(Updated) Here's the answer of question you mentioned in comment.

a.sort(function(a, b) {
  if (a.dnf != b.dnf) {
    return a.dnf ? 1 : -1;
  }
  if (!(a.dnf && b.dnf) && a.isCut != b.isCut) {
    return a.isCut ? 1 : -1;
  }
  if (a.score != b.score) {
    return b.score - a.score; // descending
  }
  return b.id - a.id; // descending
});

Result:

[
  {"id":4,"score":4,"isCut":false,"dnf":false},   // the rest: order by score, id
  {"id":3,"score":3,"isCut":false,"dnf":false},   //
  {"id":2,"score":2,"isCut":false,"dnf":false},   //
  {"id":1,"score":1,"isCut":false,"dnf":false},   //
  {"id":10,"score":0,"isCut":false,"dnf":false},  //
  {"id":11,"score":-1,"isCut":false,"dnf":false}, //
  {"id":13,"score":-3,"isCut":false,"dnf":false}, //
  {"id":14,"score":-4,"isCut":false,"dnf":false}, //
  {"id":15,"score":-5,"isCut":false,"dnf":false}, //
  {"id":16,"score":10,"isCut":true,"dnf":false}, // isCut: order by score, id
  {"id":9,"score":9,"isCut":true,"dnf":false},   //
  {"id":8,"score":8,"isCut":true,"dnf":false},   //
  {"id":7,"score":7,"isCut":true,"dnf":false},   //
  {"id":6,"score":6,"isCut":true,"dnf":false},   //
  {"id":5,"score":5,"isCut":true,"dnf":true},   // dnf: order by score, id
  {"id":12,"score":-2,"isCut":false,"dnf":true} //
]

这篇关于排序多个属性的对象的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆