2013-05-30 4 views
8

Mi piacerebbe ordinare una matrice in modo personalizzato. Esempio sarebbe classlevel di uno studente:come si applica un ordinamento personalizzato a un array?

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){ 
    // ?? 
}) 

Idealmente, il tipo dovrebbe restituire:

["Freshman","Sophomore","Junior","Senior"] 

Sto pensando che potrei pre-rank i classlevels prima del tempo come questo:

var classlevelRanked = [{ class: "Junior", 
    rank: 3 
},{ class: "Senior", 
    rank: 4 
},{ class: "Freshman", 
    rank: 1 
},{ class: "Sophomore", 
    rank: 2 
}] 

e quindi applicare un ordinamento tramite:

_.sortBy(classlevelRanked, function(classlevel){ 
    return classlevel.rank; 
}) 

Ma poi devo mettere a nudo fuori i ranghi facendo:

.map(function(classlevel){ 
    return classlevel["class"]; 
}) 

C'è un modo più diretto per farlo senza pre-classifica i classlevels e poi nudo fuori dopo?

risposta

31

Si dovrebbe essere in grado di fare qualcosa di simile:

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element]; 
}); 

Fiddle:

http://jsfiddle.net/hKQj8/

+0

esattamente quello che sto cercando. Grazie!! – Kevin

+0

JS 101: metti i tuoi ranghi al di fuori dell'istruzione callback, non c'è bisogno di ridefinire 'rank' ogni volta ... – mpowered

+0

@motorizzato, penso che possa essere un'ottica prematura. I browser dovrebbero essere in grado di riconoscerlo come costante e compilarlo una volta. Puoi anche scrivere due funzioni: una che dichiara il rango e restituisce una seconda funzione che fa la classifica. Lo spostamento di 'rank' al di fuori dell'ambito della funzione inquina l'ambito globale, e poiché si applica solo a quella funzione, è meglio averlo lì. – Jason

4

Farlo l'/ brutto modo eccellente hackish !!!! Morto semplice/follemente confusione :)

function rank(word){ 
    return Math.abs(113-word.trim().toLowerCase().charCodeAt(1)); 
} 

console.log(rank('freshman')); // 1 
console.log(rank('sophomore')); // 2 
console.log(rank('junior')); // 4 
console.log(rank('senior')); // 12 

Edit:

Dal momento che le persone sembrano essere trovare questa risposta utile, ecco una spiegazione di come funziona ... E 'sorta basa su una lettera nella parola fornita. Poiché "sophomore" e "senior" hanno una prima lettera duplicata, ho scelto di ordinare per seconda lettera ogni parola ha un valore univoco per quello.

Questo quindi li ordinerebbe in questo modo: sEnior, sOphomore, fReshman, jUnior. Per ordinarli correttamente, ho sottratto usando il codice carattere per Q (113) che è proprio accanto a R (per matricola). Ciò significa quanto vicino la seconda lettera di ogni parola è a Q determina l'ordine. Per evitare numeri negativi, la funzione prende il valore assoluto del risultato e lo restituisce.

+2

ESATTAMENTE quello che stavo cercando! Grazie!!! –

+1

Eccellente! Funziona perfettamente –

5

Oltre alla risposta di Jason:

var list = _.sortBy([{name:"Junior"},{name:"Senior"},{name:"Freshman"},{name:"Sophomore"}], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element.name]; 
}); 

console.dir(list); 

Essa vi aiuterà a risolvere array di oggetti