2012-01-02 16 views
40

estoy usando Javascript sort (con Underscore.js):uso de JavaScript con Underscore.js para ordenar a la inversa

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name}) 
> ["Alice", "Bob", "Mary"] 

me gustaría la matriz para volver a la inversa. ¿Cómo puedo hacer eso?

[ "María", "Bob", "Alicia"]

no quiero darle la vuelta después de que se clasifica - Quiero que se creará al revés la primera vez .

Gracias.

+1

Te das cuenta de que, en última instancia, podría ser más rápido ordenar la matriz normalmente, y luego llamar a 'reverse()'? –

+0

Ordenar y luego invertir también sería mucho más legible que otras opciones. –

Respuesta

32

Haría lo que haga bajo Under the Hood: use el método Array#sort.

["Bob", "Mary", "Alice"].sort(function (a, b) { 
    if (a < b) return 1; 
    if (b < a) return -1; 
    return 0; 
}); 

O si no desea que la matriz original modificado, clonarlo en primer lugar:

_.clone(["Bob", "Mary", "Alice"]).sort(...) 
+0

me funcionó cuando invertí menos de signos a más de –

78

En lugar de tirar underscorejs lejos, yo prefiero usar junto con Array.reverse de utilizar lo mejor de ambos.

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name}) 
.reverse() 
+8

Además, en lugar de la función (nombre) {nombre de retorno}, puedes usar la función _identidad de subrayado: _.sortBy (["Bob", "Mary "," Marley "," Alice "], _.identity).reverse() – djKianoosh

+4

No llamaría esto más elegante porque la llamada '.reverse()' agrega otro ciclo a través de la matriz. Por lo tanto, en realidad es menos eficiente que simplemente ordenar al revés, como ha sugerido Félix. – Eschaton

+1

"Es más fácil hacer un buen código rápido que hacer que el código rápido sea bueno". (Atribuya esto a algún gurú, no recuerdo quién lo dijo antes) Esto es más "elegante", si la velocidad es lo que se necesita, la clasificación predeterminada puede ser suficiente; pero si la velocidad es la principal preocupación, JS no es la tecnología más rápida. – Txangel

0

Es obvio que no debe hacer esto, ya que hace mucho más sentido para ordenar, y luego revertir los resultados, pero si realmente desea ordenar en orden inverso dentro de la función de clasificación, que podría hacer algo como esto. ..

_.sortBy(["Bob", "Mary", "Alice"], function (a) { 
    // split each string into single characters 
    // ... then swap for inverse character from unicode range 
    // ... and glue the characters back together into an inversely sortable string 
    return _.map(a.split(''), function(i){ 
     return String.fromCharCode(65536 - i.charCodeAt(0)); 
    }).join(''); 
}); 

... también vale la pena señalar que subrayado es sutilmente diferente de JavaScript nativo especie que tiene un pequeño problema multiplataforma con respecto a un orden coherente ...

Si compareFunction (a, b) devuelve 0, deja a a y b sin cambios el uno con respecto al otro, pero ordenado con respecto a todos los elementos diferentes. Nota: el estándar ECMAscript no garantiza este comportamiento, por lo que no todos los navegadores (por ejemplo, versiones de Mozilla que datan de al menos 2003) lo respetan. Array.prototype.sort()

estados .sortBy documentación de Guión:

Devuelve una (de forma estable) ordenados copia de la lista. _.sortBy

¿Qué lo hace por lugar de devolver 0 para mantener los elementos en orden, devuelve el índice del lado izquierdo menos el índice de la mano derecha.

_.sortBy = function(obj, iteratee, context) { 
    iteratee = cb(iteratee, context); 
    return _.pluck(_.map(obj, function(value, index, list) { 
    return { 
     value: value, 
     index: index, 
     criteria: iteratee(value, index, list) 
    }; 
    }).sort(function(left, right) { 
    var a = left.criteria; 
    var b = right.criteria; 
    if (a !== b) { 
     if (a > b || a === void 0) return 1; 
     if (a < b || b === void 0) return -1; 
    } 
    return left.index - right.index; 
    }), 'value'); 
}; 
Cuestiones relacionadas