Sorting array of custom objects in JavaScript

后端 未结 3 1383
小蘑菇
小蘑菇 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<len;++i){
            if (a[i]!=b[i]) return a[i]<b[i]?-1:1;
          }
          return 0;
        });
        for (var i=this.length;i;){
          this[--i]=this[i][this[i].length-1];
        }
        return this;
      }
    })();
    
    0 讨论(0)
  • 2021-01-06 10:20
    function getSortFunction(fieldName) {
        return function(employee1, employee2) {
            return employee1[fieldName] > employee2[fieldName];
        }
    }
    
    employees.sort(getSortFunction("myField"));
    

    Another solution is to use Function.prototype.bind if you are not afraid of it :)

    function mySorter(fieldName, employee1, employee2) {
        return employee1[fieldName] > employee2[fieldName];
    }
    
    employees.sort(mySorter.bind(null, "myField"));
    
    0 讨论(0)
  • 2021-01-06 10:29

    You could use the excellent library underscore.js' sortBy method.

    For example:

    var arr = [
        { name:"a", age:100 },  
        { name:"b", age:90 },
        { name:"c", age:80 },
        { name:"d", age:70 }
    ];
    
    var sorted = _.sortBy(arr, "age");
    console.log( sorted );
    

    or in your case:

    _.sortBy(employees, "age");
    
    0 讨论(0)
提交回复
热议问题