2012-01-02 10 views
40

Sto utilizzando Javascript sort (con Underscore.js):di JavaScript con Underscore.js per ordinare il contrario

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

Vorrei la matrice per tornare nella direzione opposta. Come lo faccio?

[ "Mary", "Bob", "Alice"]

Non voglio invertire dopo che si è ordinato - voglio che essere creato il contrario per la prima volta .

Grazie.

+1

Ti rendi conto che alla fine potrebbe essere solo più veloce ordinare l'array normalmente, quindi chiamare 'reverse()'? –

+0

Anche l'ordinamento e l'inversione sono molto più leggibili rispetto ad altre opzioni. –

risposta

32

Vorrei semplicemente fare ciò che Underscore fa sotto il cofano: utilizzare il metodo Array#sort.

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

Oppure, se non si desidera che la matrice originale modificata, clonarlo prima:

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

ha funzionato per me quando ho invertito meno di segni a maggiore di –

78

Invece di buttare via underscorejs, io preferisco usare insieme con Array.reverse di utilizzare il meglio di entrambi.

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

Inoltre, anziché la funzione (nome) {return name} puoi semplicemente usare la funzione _.identity del carattere di sottolineatura: _.sortBy (["Bob", "Mary "," Marley "," Alice "], _.identity).reverse() – djKianoosh

+4

Non lo chiamerei più elegante perché la chiamata '.reverse()' aggiunge un altro ciclo attraverso l'array. Quindi è in realtà meno efficiente rispetto alla semplice selezione al contrario, come suggerito da Felix. – Eschaton

+1

"È più facile rendere il codice più veloce che creare un codice veloce." (Attribuisci questo ad alcuni Guru, non riesco a ricordare chi l'abbia detto prima) Questo è più "elegante", se la velocità è ciò che è necessario l'ordinamento predefinito potrebbe essere sufficiente; ma se la velocità è la preoccupazione principale, JS non è la tecnologia più veloce in circolazione. – Txangel

0

Ovviamente non si dovrebbe fare, in quanto rende molto più senso per ordinare, poi invertire i risultati, ma se si vuole veramente per ordinare in ordine inverso all'interno della funzione di ordinamento, si potrebbe fare qualcosa di simile. ..

_.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(''); 
}); 

... anche la pena notare che la sottolineatura è leggermente diverso da quello javascript nativo specie che ha un piccolo problema cross-platform per quanto riguarda un sistema di classificazione coerente ...

Se compareFunction (a, b) restituisce 0, lascia aeb invariato l'uno rispetto all'altro, ma ordinato rispetto a tutti gli elementi diversi. Nota: lo standard ECMAscript non garantisce questo comportamento, quindi non tutti i browser (ad esempio versioni di Mozilla risalenti almeno al 2003) lo rispettano. Array.prototype.sort()

.sortBy documentazione afferma di sottolineatura:

Restituisce un (stabilmente) In ordine copia della lista. _.sortBy

cosa che fa da invece di tornare 0 per mantenere gli articoli in ordine, restituisce l'indice del lato sinistro meno l'indice del lato destro.

_.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'); 
}; 
Problemi correlati