2013-01-24 14 views
9

Ho una matrice di oggetti che ho bisogno di ordinare su una funzione personalizzata, dal momento che voglio farlo più volte su diversi attributi dell'oggetto mi piacerebbe passare il nome chiave per l'attributo dinamicamente nella funzione di ordinamento personalizzato:js sort() funzione personalizzata come posso passare più parametri?

function compareOnOneFixedKey(a, b) { 
    a = parseInt(a.oneFixedKey) 
    b = parseInt(b.oneFixedKey) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 

arrayOfObjects.sort(compareByThisKey) 

dovrebbe diventato qualcosa di simile:

function compareOnKey(key, a, b) { 
    a = parseInt(a[key]) 
    b = parseInt(b[key]) 
    if (a < b) return -1 
    if (a > b) return 1 
     return 0 
} 
arrayOfObjects.sort(compareOn('myKey')) 

si può fare in un modo conveniente? Grazie.

risposta

9

È necessario partially apply la funzione, ad esempio utilizzando bind:

arrayOfObjects.sort(compareOn.bind(null, 'myKey')); 

O semplicemente fare compareOn di ritorno la funzione di ordinamento attuale, parametrizzata con gli argomenti della funzione esterna (come dimostrato dagli altri).

+0

+1 per metodo che non sono riuscito a considerare completamente. –

+0

Oltre al metodo è buono ha ancora problemi di compatibilità. – VisioN

+1

@VisioN: ... ma rende molte cose più semplici :-) Per chiunque stia considerando il supporto di vecchi IE, la pagina MDN collegata contiene uno shim – Bergi

9

Puoi aggiungere un wrapper:

function compareOnKey(key) { 
    return function(a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 

arrayOfObjects.sort(compareOnKey("myKey")); 
4

Sì, hanno il comparatore tornato da un generatore che prende un parametro che è la chiave che si desidera

function compareByProperty(key) { 
    return function (a, b) { 
     a = parseInt(a[key], 10); 
     b = parseInt(b[key], 10); 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 
} 
arrayOfObjects.sort(compareByProperty('myKey')); 

compareByProperty('myKey') restituirà la funzione di fare il confronto, che viene quindi passato in .sort

+0

funziona bene, ma ha scelto il modo. Bind() per la sua flessibilità. grazie per il refactoring del mio codice con la base 10 in parseInt :) –

Problemi correlati