Ordinamento di un arrays in Javascript

Ho una matrix semplice che vorrei riordinare. Questa matrix potrebbe contenere solo numbers, o semplicemente parole, o una combinazione come quando si descrive la valuta. Il seguente codice funziona meravigliosamente se è una parola o semplicemente numbers, ma non ordina la valuta come un uomo si aspetterebbe. Ordina lexicograficamente in valuta ($ 100 prima di $ 3), mentre vorrei ordinarla per numero ignorando qualsiasi altro personaggio del valore.

howmuchdata = ["$85", "88 dollars", "$9.35", "$95", "96", "126", "5.95", "$36", "€124"]; howmuchdata = howmuchdata.sort(); howmuchdata = howmuchdata.sort(function(a,b){return ab}); console.log(howmuchdata); 

È solo una questione di rimuovere tutto, ma il numero, ordinare in base al numero lasciato indietro e aggiungere che altro è stato rimosso dentro? Qualunque sia rimosso e rimesso indietro può essere diverso per each valore, quindi non posso solo coperta tirarla fuori e ripristinarlo, deve essere fatto su base di valore. Mi piacerebbe che l'arrays tornasse come tale:

 howmuchdata = ["5.95", "$9.35", "$36", "$85", "88 dollars", "$95", "96", "€124", "126"]; 

Grazie mille per il tuo aiuto!

è ansible utilizzare RegEx nella callback di sorting, proprio così:

 howmuchdata = ["$85", "88 dollars", "$9.35", "$95", "96", "126", "5.95", "$36", "€124"]; howmuchdata = howmuchdata.sort(); howmuchdata = howmuchdata.sort(function(a,b){ a = parseFloat(a.replace(/[^\d\.]/,'')); b = parseFloat(b.replace(/[^\d\.]/,'')); return ab; }); console.log(howmuchdata); 

In bocca al lupo!

Prima di tutto, stai ordinando due volte.

In secondo luogo, sort ordinate l'arrays in loco. Non è necessario assegnare nuovamente il suo risultato ad un'altra variabile.

Terzo: si desidera ordinare i dati numbersci; ma tu lo ami le corde. Quindi è necessario in qualche modo convertire i dati string in numbersche.

Prova questo (non testato):

 howmuchdata.sort(function(a,b){return Number(a.match(/\d+(\.\d*)?/)) - Number(b.match(/\d+(\.\d*)?/)) } ); 

Ci sono milioni di modi per definire "ordine" sul tuo Array of Strings. Ma non ci sono milioni di funzioni di sorting in Javascript.

Raccommand di farlo in tre fasi:

  1. Convertire la tua matrix in qualche forma più usuale, ad esempio numbers (for-loop e pars).
  2. Utilizzare lo standard Array.sort per ordinare i tuoi numbers.
  3. Trasformare l'arrays di numbers ripristinato nel formato precedente (è ansible memorizzare le informazioni sulle coppie String-Number prima di ordinare e utilizzarlo alla fine).

In quei casi uso la seguente function di sort :

 function sort(arr, f, isNum) { var l = arr.length; for(var i=0; i<l; ++i) arr[i] = [f(arr[i]), arr[i]]; arr.sort(isNum ? function(a,b){ return a[0]-b[0]; } : function(a,b){ return a[0]<b[0] ? -1 : a[0]>b[0] ? 1 : 0; } ); for(var i=0; i<l; ++i) arr[i] = arr[i][1]; return arr; } 

Usalo come questo:

 sort(howmuchdata, function(i){ return i.match(/[\d.]+/)[0]; }, true); /* or */ sort(howmuchdata, function(i){ return +i.match(/[\d.]+/)[0]; }); 

In ES6 sarà meglio:

 sort(howmuchdata, i => +i.match(/[\d.]+/)[0]);