Sorting array of custom objects in JavaScript

后端 未结 3 1384
小蘑菇
小蘑菇 2021-01-06 09:30

Say I have an array of Employee Objects:

var Employee = function(fname, age) {
    this.fname = fname;
    this.age = age;
}

var employees = [
    new Emplo         


        
3条回答
  •  离开以前
    2021-01-06 10:17

    I provide my own sortBy method for arrays that lets you specify an arbitrary number of fields to sort by, using a Schwartzian transform:

    Example 1

    var a=[ {c:"GK",age:37}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"AK",age:13} ];
    
    a.sortBy( function(){ return this.age } );                                   
    // [ {c:"ZK",age:13}, {c:"AK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ] 
    
    a.sortBy( function(){ return [this.age,this.c] } );                          
    // [ {c:"AK",age:13}, {c:"ZK",age:13}, {c:"TK",age:14}, {c:"GK",age:37} ] 
    
    a.sortBy( function(){ return -this.age } );                                  
    // [ {c:"GK",age:37}, {c:"TK",age:14}, {c:"ZK",age:13}, {c:"AK",age:13} ] 
    

    Example 2:

    var n=[ 1, 99, 15, "2", "100", 3, 34, "foo", "bar" ];                        
    
    n.sort();                                                                    
    // [ 1, "100", 15, "2", 3, 34, 99, "bar", "foo" ]                         
    
    n.sortBy( function(){ return this*1 } );                                     
    // [ "foo", "bar", 1, "2", 3, 15, 34, 99, "100" ]                         
    
    n.sortBy( function(o){ return [typeof o,this] } );                           
    // [1, 3, 15, 34, 99, "100", "2", "bar", "foo"]                           
    
    n.sortBy(function(o){ return [typeof o, typeof o=="string" ? o.length : o] })
    // [1, 3, 15, 34, 99, "2", "100", "bar", "foo"]                           
    

    The Code

    (function(){
      // This code is copyright 2012 by Gavin Kistner, !@phrogz.net
      // License: http://phrogz.net/JS/_ReuseLicense.txt
      if (typeof Object.defineProperty === 'function'){
        try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}
      }
      if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;
    
      function sb(f){
        for (var i=this.length;i;){
          var o = this[--i];
          this[i] = [].concat(f.call(o,o,i),o);
        }
        this.sort(function(a,b){
          for (var i=0,len=a.length;i

提交回复
热议问题