Javascript 按多个属性对对象数组进行排序

Javascript 按多个属性对对象数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有这样一个对象数组: 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, i

我有这样一个对象数组:

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 }
];
我需要按照以下条件对数组进行分组和排序:

  • 如果
    dnf
    为真,则对象将进入底部;所有
    dnf
    -对象应按分数排序
  • 如果
    isCut
    为true,则对象位于底部,但位于
    dnf
    s上方;所有
    isCut
    -对象应按分数排序
  • 其余部分应按
    score
    排序,如果分数相等,则按
    id

  • 使用数组中的比较器函数

    您可以在此处查看答案:

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

    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
    });
    
    结果:

    [
      {"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} //
    ]
    

    这是一种不同的方法,如果使用
    dnf
    isCut
    属性而不同时查看这两种属性,则使用数组作为排序顺序,排序顺序是不规则的。如果我们将两个值都带到真值表,那么排序顺序不会反映所需的顺序

    要更正排序顺序,我建议使用数组来获得正确的顺序

    var data=[{id:1,分数:1,isCut:false,dnf:false},{id:2,分数:2,isCut:false,dnf:false},{id:3,分数:3,isCut:false,dnf:false},{id:4,分数:4,isCut:false,dnf:false},{id:5,分数:5,isCut true,dnf:true},{id:6,isCut true,dnf:false,{id:7,isCut false,dnf:false},{id:8,分数:8,isCut:true,dnf:false},{id:9,分数:9,isCut:true,dnf:false},{id:10,分数:0,isCut:false,dnf:false},{id:11,分数:-1,isCut:false,dnf:false},{id:12,分数:-2,isCut:false,dnf:true},{id:13,分数:-3,isCut:false,dnf:false},{id:14,分数:-4,isCut:false,dnf:false},{id:15,分数:-5,isCut:false,dnf:false},{id:16,分数:10,isCut:true,dnf:false}];
    数据排序(函数(a,b){
    函数顺序(dnf,isCut){返回[0,1,3,2][dnf*2+isCut];}
    退货订单(a.dnf,a.isCut)-订单(b.dnf,b.isCut)| | b.score-a.score;
    });
    console.log(数据);

    .as控制台包装{最大高度:100%!重要;顶部:0;}
    Array.sort接受一个比较器函数。是的,但是如何实现它,这是个问题。看看这个,我希望这会对你有所帮助:)这是按
    dnf
    首先排序。
    isCut
    不会被准确排序。你首先需要所有
    isCut
    为true的项,然后是
    isCut
    为false的项e、 @amberlamps我不明白。你不想让
    dnf
    对象放在底部吗?那么我们应该先按
    dnf
    排序。你理解正确,但他想
    isCut
    在上面,如果它是
    真的
    ,那么它可以像
    真的
    真的
    假的
    。@amberlamps明白了!谢谢你的解释。你必须用很多不同的数据来测试它才能真正确定,但到目前为止我看起来很好。+1
                       2*dnf+isCut
        dnf     isCut     value     order
    --------  --------  --------  --------
         0         0         0         0
         0         1         1         1
         1         1         3         2
         1         0         2         3