【问题标题】:javascript - sort by multiple criteria - first by another array and then by another property insidejavascript - 按多个标准排序 - 首先按另一个数组,然后按内部的另一个属性
【发布时间】:2016-07-13 10:13:20
【问题描述】:

我有一个对象数组,如下所示,需要以这样的方式对其进行排序,即先有 c 的项目,然后是 y ,然后是 s。在这方面,例如在c中,它应该按计数器排序,即c-counter 1,c-counter 2。

var data = [ { age:7, counter: 1, code: 'c'},
     { age:5, counter: 2, code: 'c'},
     { age:4, counter: 3, code: 'c'},
     { age:19, counter: 2, code: 'y'},
     { age:22, counter: 1, code: 'y'},
     { age:57, counter: 1, code: 's'},
     { age:80, counter: 2, code: 's'}
    ]

在查看 SO 时,我能够按 c、y、s 排序,如下所示,但无法对里面的 counter 进行另一种排序。我该怎么做。

var order =[c,y,s];
data.sort(function(a,b){
        return order.indexOf(a.code) < order.indexOf(b.code) ? -1:1;
})

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    您可以使用code 顺序的对象,然后按计数排序。

    var data = [{ age: 7, counter: 1, code: 'c' }, { age: 5, counter: 2, code: 'c' }, { age: 4, counter: 3, code: 'c' }, { age: 19, counter: 2, code: 'y' }, { age: 22, counter: 1, code: 'y' }, { age: 57, counter: 1, code: 's' }, { age: 80, counter: 2, code: 's' }];
    
    data.sort(function (a, b) {
        var order = { c: 1, y: 2, s: 3 };
        return order[a.code] - order[b.code] || a.counter - b.counter;
    });
    
    console.log(data);

    【讨论】:

    • 我无法将计数器放入对象中。
    • @whyAto8,这是什么意思?
    • 抱歉,我弄错了代码,因此写了这个。请忽略。
    【解决方案2】:

    你需要指定数组为

    var order =['c', 'y', 's'];
    

    否则 c、y 和 s 需要是变量。

    此外,如果代码相等,您还需要比较计数器变量

    data.sort(function(a,b){
       if ( a.code == b.code )
       {
            return a.counter - b.counter;
       }
       else
       {
           return order.indexOf(a.code) - order.indexOf(b.code);
       }
    })
    

    【讨论】:

      【解决方案3】:

      这是一种按计数器排序的简单方法:

      var order = [ 'c', 'y', 's' ];
      
      data.sort(function (a,b) {
          var o;
      
          if (order.indexOf(a.code) === order.indexOf(b.code))
          {
              o = a.counter - b.counter;
          } else {
              o = order.indexOf(a.code) - order.indexOf(b.code);
          }
      
          return o;
      });
      

      【讨论】:

        【解决方案4】:

        这是一种动态方式,允许您添加条件以逐个进行比较。

        var data = [{ age: 7, counter: 1, code: 'c' }, { age: 5, counter: 2, code: 'c' }, { age: 4, counter: 3, code: 'c' }, { age: 19, counter: 2, code: 'y' }, { age: 22, counter: 1, code: 'y' }, { age: 57, counter: 1, code: 's' }, { age: 80, counter: 2, code: 's' }];
        
        Array.prototype.orderBy = function(...expresions) {
          var arr = this;
          return this.sort((a, b) => {
            var result;
            expresions.every(ex => (result = ex(a) - ex(b)) === 0)
            return result;
          });
        }
        
        var codeOrder = {
          c: 1,
          y: 2,
          s: 3
        };
        var result = data
          .orderBy(i => codeOrder[i.code], i => i.counter)
        console.log(result);

        工作原理

        用法很简单:

        dataArray.sortBy(ex1[, ex2[, ex3]])
        

        此方法的每个参数都是一个函数,它接受来自dataArray 的一个项目作为输入,并返回一个与该项目相关的数字。如果任何表达式相对于相邻项返回相同的值,则继续评估项和相邻项上的下一个表达式,直到它们返回不同的结果或没有其他表达式要测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-25
          • 2016-07-03
          • 1970-01-01
          • 1970-01-01
          • 2018-11-19
          • 1970-01-01
          • 2019-03-23
          • 1970-01-01
          相关资源
          最近更新 更多