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

Relaterade artiklar