javascript - Sortera objekt i en array alfabetiskt efter en egenskap i arrayen
Låt oss säga att du har en JavaScript-klass som den här
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
Låt oss säga att du sedan skapar ett antal instanser av den klassen och lagrar 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å jag skulle nu ha en array av objekt skapade av DepartmentFactory. Hur skulle jag gå tillväga för att använda array.sort()-metoden för att sortera denna array av objekt efter DepartmentName-egenskapen hos varje objekt?
Metoden array.sort() fungerar alldeles utmärkt när man sorterar en array av strängar
var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]
Men hur får jag det att fungera med en lista av objekt?
Svar #1
du skulle behöva göra något sådant här:
objArray.sort(function(a, b) {
var textA = a.DepartmentName.toUpperCase();
var textB = b.DepartmentName.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
obs: att ändra skiftläge (till versaler eller gemener) säkerställer en skiftlägesokänslig sortering.
Svar #2
För att stödja unicode:
objArray.sort(function(a, b) {
return a.DepartmentName.localeCompare(b.DepartmentName);
});
Svar #3
Kortare kod 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'}));
Det sorterar dem alfabetiskt OCH är skiftlägesokänsligt. Det är också superrent och lätt att läsa :D
