Hace unos días me encontraba desarrollando una aplicacíon que necesitaba ser ordenada por 4 campos. Si ya eres un desarrollador Javascript o Node.js y haz trabajado con un array de objetos (pongo un ejemplo debajo de este párrafo) en algún momento haz necesitado de ordenarlo.


var objects = [
    {
        name:"Web Scriptmatico",
        email: "admin@example.com",
        signupdate: "2016-01-25T12:12:00.000Z"
    },{
        name:"Sergio Mayer",
        email: "sergio@example.com",
        signupdate: "2016-02-25T12:13:00.000Z"
    },{
        name:"Administrador",
        email: "admin@administrador.com",
        signupdate: "2016-01-29T12:15:00.000Z"
    }
]

Bien, ordenarlo por un campo no es tarea difícil, solo tienes que usar la funcion sort del objeto array y usar una función que se encargue de hacer la comparación:


array.sort(function (v1, v2) { 
    new Date(v1['signupdate']) - new Date(v2['signupdate']);
});

Lo complicado viene cuando tienes que ordenar ese objeto por mas campos, entonces, ¿como realizamos un multi sort?. Para ello necesitamos el uso de algunas funciones adicionales, el siguiente código realiza la comparación de varios campos de forma descendente, es decir que dado un array de funciones usadas como comparadores empezara con el primero dado hasta el ultimo.


/**
* Pasa una función de comparación a otro comparador
* Y devuelve el resultado del primer comparador, a menos que
* El primer comparador devuelve 0, en cuyo caso se
* Se utiliza el resultado del segundo comparador.
 */
function makeChainedComparator(first, next) {
  return function(a, b) {
    var result = first(a, b);
    if (result !== 0) return result;
    return next(a, b);
  }
}

/**
 * Dada una matriz de comparadores, devuelve un nuevo comparador con
 * Prioridad descendente tal que
 * El próximo comparador sólo se utilizará si el comparador precedente ha regresado
 * 0 (es decir, encontró que los dos objetos eran iguales)
 *
 * Permite múltiples tipos de ser utilizado simplemente. Por ejemplo,
 * Ordenar por columna a, luego ordenar por columna b, luego ordenar por columna c
 */
function compositeComparator(comparators) {
  return comparators.reduceRight(function(memo, comparator) {
    return makeChainedComparator(comparator, memo);
  });
}

/**
 * Creamos un comparador basico
 */
function basicComparison(field) {
  return function(a, b) {
    var c1 = a[field];
    var c2 = b[field];
    if (c1 > c2) return 1;
    if (c1 < c2) return -1;
    return 0;
  }
}

function basicComparisonDate(field) {
  return function(a,b){
    new Date(a[field]) - new Date(b[field]);
  }            
}

Ya tenemos nuestras funciones, tomando el ejemplo de nuestro objeto array que puse más arriba entonces procedemos a ordenarlo:



var comparators = compositeComparator([
            basicComparison('name'), 
            basicComparison('email'), 
            basicComparisonDate('signupdate')
        ]);

objects.sort(comparators);

// hacemos un cosole.log para ver el resultado que seria el siguiente:
console.log(JSON.stringify(objects));



[
	{
	    "name":"Administrador",
	    "email":"admin@administrador.com",
	    "signupdate":"2016-01-29T12:15:00.000Z"
	},{
	    "name":"Sergio Mayer",
	    "email":"sergio@example.com",
	    "signupdate":"2016-02-25T12:13:00.000Z"
	},{
	    "name":"Web Scriptmatico",
	    "email":"admin@example.com",
	    "signupdate":"2016-01-25T12:12:00.000Z"
	}
]

Y LISTO!! Tenemos nuestro objeto ordenado!

Ahora solo quedaría hacer algunas pruebas en nuestro array y comenzar a jugar con nuestro código de ordenamiento.