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

Relaterte artikler