javascript - Sorter objekter i en array alfabetisk etter en egenskap i arrayen
La oss si at du har en JavaScript-klasse som dette
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
La oss si at du deretter oppretter flere instanser av den klassen og lagrer dem i en array
var objArray = [];
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
Så jeg ville nå ha et array av objekter opprettet av DepartmentFactory. Hvordan ville jeg gå frem for å bruke array.sort()-metoden for å sortere dette arrayet av objekter etter DepartmentName-egenskapen til hvert objekt?
Metoden array.sort() fungerer helt fint når man sorterer et array med strenger
var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]
Men hvordan får jeg det til å fungere med en liste av objekter?
Svar #1
du måtte gjøre noe slik:
objArray.sort(function(a, b) {
var textA = a.DepartmentName.toUpperCase();
var textB = b.DepartmentName.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
merknad: å endre bokstavstil (til store eller små bokstaver) sikrer en sortering som ikke skiller mellom store og små bokstaver.
Svar #2
For å støtte Unicode:
objArray.sort(function(a, b) {
return a.DepartmentName.localeCompare(b.DepartmentName);
});
Svar #3
Kortere kode med ES6
objArray.sort((a, b) => a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase()))
Svar #4
objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
Svar #5
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
// use `new DepartmentFactory` as given below. `new` is imporatant
var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
function sortOn(property){
return function(a, b){
if(a[property] < b[property]){
return -1;
}else if(a[property] > b[property]){
return 1;
}else{
return 0;
}
}
}
//objArray.sort(sortOn("id")); // because `this.id = data.Id;`
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;`
console.log(objArray);
demo: http://jsfiddle.net/diode/hdgeH/
Svar #6
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));
Dette sorterer dem alfabetisk OG er ikke følsom for store og små bokstaver. Det er også superrent og lett å lese :D
