dire che ho un array di oggetti persona:Ordina un array il contenuto di un'altra in JavaScript
var people = [{name: "Joe Schmo", age: 36}, {name: "JANE DOE", age: 40}];
e ho una funzione che può ordinare un array di caso stringhe insensitively:
function caseInsensitiveSort(arr) { ... }
Esiste un modo semplice per combinare la mia funzione di ordinamento esistente con Array.prototype.map
per ordinare l'array people
usando solo la chiave name
?
I.e. produrrebbe
var people = [{name: "JANE DOE", age: 40}, {name: "Joe Schmo", age: 36}];
farlo a mano non è difficile in questo caso particolare,
people.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
ma non riesco a pensare ad un modo di farlo che mi avrebbe permesso di usare il pre- funzione di ordinamento esistente. In un caso in cui la funzione di ordinamento è più personalizzata, sarebbe utile.
Edit: Credo che il problema principale qui è che per fare questo bene, è necessario essere in grado di capire a cosa sono stati mappati gli indici originali quando si ordina l'array proxy. Ottenere quei nuovi indici usando la funzione nativa di JS sort
non sembra possibile nel caso generale. Ma sarei felice di essere smentito.
Modifica: Il modo in cui stavo cercando di farlo è troppo inefficiente per essere utile. Vedere la risposta sotto per la soluzione usando invece una funzione di confronto.
Se 'caseInsensitiveSort' accetta un array, è necessario passare una matrice dei nomi a tale funzione, ordinare i nomi e quindi ordinare l'array con gli oggetti in base all'array con i nomi. Sembra un modo davvero complicato per fare qualcosa di semplice. – adeneo
Gestirà pochi elementi? Perché il metodo 'Array.prototype.map' crea un nuovo array, quindi con milioni di record l'opzione migliore è ordinarla sul posto. –
@adeneo @Jordan Siete entrambi corretti. Come xdazz ha sottolineato di seguito, il modo corretto per farlo in modo efficiente è di astrarre la logica del mio confronto in una funzione separata, e fornire quella a 'Array.prototype.sort', piuttosto che cercare di incuneare la mia funzione di ordinamento in. –