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

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

问题描述

我有一个这样的对象数组:

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 }];

我需要按照以下条件对数组进行分组和排序:

  1. 如果dnf为真,则对象到底部;所有 dnf-objects 都应该按分数排序
  2. 如果isCut为真,则对象下到底部,但在dnfs之上;所有 isCut-对象都应按分数排序
  3. rest 应按score排序,如果分数相等,则按id

解决方案

(更新)这是您在评论中提到的问题的答案.

a.sort(function(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,"score":4,"isCut":false,"dnf":false},//其余:按分数排序,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:按分数排序,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: 按分数排序,id{"id":12,"score":-2,"isCut":false,"dnf":true}//]

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天全站免登陆