Sortieren Sie Objekte in einem Array alphabetisch nach einer Eigenschaft des Arrays

200

Angenommen, Sie haben eine solche JavaScript-Klasse

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

Angenommen, Sie erstellen dann eine Reihe von Instanzen dieser Klasse und speichern sie in einem 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}));

Also hätte ich jetzt eine Reihe von Objekten erstellt von DepartmentFactory. Wie würde ich die array.sort()Methode verwenden, um dieses Array von Objekten nach der DepartmentNameEigenschaft jedes Objekts zu sortieren ?

Die array.sort()Methode funktioniert einwandfrei, wenn ein Array von Zeichenfolgen sortiert wird

var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]

Aber wie mache ich es mit einer Liste von Objekten?

jdavis
quelle
Sie können eine Sortierfunktion als erstes Argument an .sort () übergeben.
Paul Tomblin
2
Da Sie DepartmentFactoryals Konstruktor verwenden, erstellen Sie seine Objekte mit new DepartmentFactory, andernfalls wird das Array mit einer Reihe von undefinedWerten gefüllt .
Anurag

Antworten:

341

Sie müssten so etwas tun:

objArray.sort(function(a, b) {
    var textA = a.DepartmentName.toUpperCase();
    var textB = b.DepartmentName.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

Hinweis: Durch Ändern der Groß- / Kleinschreibung (Groß- oder Kleinschreibung) wird eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung sichergestellt.

Omer Bokhari
quelle
3
Ich bin 50 Millionen Mal zu Ihrer Antwort gekommen, weil ich mich nie erinnern kann, wie das geht. FWIW, mein Linter informiert mich immer über "unbegründete Klammern um den Ausdruck": return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;Ich werde Ihre Antwort nicht bearbeiten und hoffe, dass ich mich zumindest an die
Flusensache
Vielen Dank für diesen Omer
Ted Fitzpatrick
Es wurde ein Problem mit diesem Code gefunden. Verwenden Sie eine Kombination aus Klein- und Großbuchstaben. Ex. credit_card_no und Stadt. Der Code sortiert die Liste, aber Wörter, die mit 'c' beginnen, werden nicht zusammen gruppiert.
Kedar
156

So unterstützen Sie Unicode:

objArray.sort(function(a, b) {
   return a.DepartmentName.localeCompare(b.DepartmentName);
});
Ron Tornambe
quelle
7
Verwenden Sie für eine Version ohne return a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase());
Berücksichtigung der
3
Lerne jeden Tag etwas Neues - localeCompareist cool und hat alle Browser-Unterstützung für das erste Argument. Nicht schlecht!
Obzenner
4
@ BenBarreth Es gibt keinen Grund, die Zeichenfolgen in Kleinbuchstaben zu schreiben. Der springende Punkt localeCompareist, die Arbeit der Verwaltung der Sortierlogik und der Gebietsschema-Macken auf das System zu verlagern. Wenn es für das Gebietsschema normal ist, eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, wie dies in Englisch der Fall ist, wird dies für Sie erledigt: "Z" > 'a' // false "Z".localeCompare('a') // 1 Wenn Sie von der Standardeinstellung des Gebietsschemas abweichen möchten, können Sie Überschreibungen in den Parametern localesund senden options: developer.mozilla. org / de-US / docs / Web / JavaScript / Reference /…
Jon z
12
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/

Diode
quelle
9
// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.)
function sortOn (arr, prop) {
    arr.sort (
        function (a, b) {
            if (a[prop] < b[prop]){
                return -1;
            } else if (a[prop] > b[prop]){
                return 1;
            } else {
                return 0;   
            }
        }
    );
}

//Usage example:

var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
        ];

// ------- make -------
sortOn(cars, "make");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Koenigsegg  : CCGT  : 2011
Pagani      : Zonda : 2006
*/



// ------- model -------
sortOn(cars, "model");
console.log(cars);

/* OUTPUT:
Koenigsegg  : CCGT  : 2011
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
*/



// ------- year -------
sortOn(cars, "year");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
Koenigsegg  : CCGT  : 2011
*/
Bob
quelle
5

DEMO

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

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}));

console.log(objArray.sort(function(a, b) { return a.name > b.name}));
qwertymk
quelle
2
objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
Neil
quelle
1

mach es so

objArrayy.sort(function(a, b){
 var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()
 if (nameA < nameB) //sort string ascending
  return -1
 if (nameA > nameB)
  return 1
 return 0 //default return value (no sorting)
});
console.log(objArray)
Nickleefly
quelle
1
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));

Dies sortiert sie alphabetisch UND unterscheidet nicht zwischen Groß- und Kleinschreibung. Es ist auch super sauber und leicht zu lesen: D.

Alissa
quelle
Viel eleganter als die akzeptierte Lösung!
Kano
0

Hier ist eine einfache Funktion, mit der Sie ein Array von Objekten nach ihren Eigenschaften sortieren können. Es spielt keine Rolle, ob es sich bei der Eigenschaft um eine Art Zeichenfolge oder eine Ganzzahl handelt, sie funktioniert.

    var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
    ];

    function sortObjectsByProp(objectsArr, prop, ascending = true) {
        let objectsHaveProp = objectsArr.every(object => object.hasOwnProperty(prop));
        if(objectsHaveProp)    {
            let newObjectsArr = objectsArr.slice();
            newObjectsArr.sort((a, b) => {
                if(isNaN(Number(a[prop])))  {
                    let textA = a[prop].toUpperCase(),
                        textB = b[prop].toUpperCase();
                    if(ascending)   {
                        return textA < textB ? -1 : textA > textB ? 1 : 0;
                    } else {
                        return textB < textA ? -1 : textB > textA ? 1 : 0;
                    }
                } else {
                    return ascending ? a[prop] - b[prop] : b[prop] - a[prop];
                }
            });
            return newObjectsArr;
        }
        return objectsArr;
    }

    let sortedByMake = sortObjectsByProp(cars, "make"); // returns ascending order by its make;
    let sortedByYear = sortObjectsByProp(cars, "year", false); // returns descending order by its year,since we put false as a third argument;
    console.log(sortedByMake);
    console.log(sortedByYear);

Michael Norward
quelle
-1

Sie müssen eine Funktion übergeben, die zwei Parameter akzeptiert, vergleicht und eine Zahl zurückgibt. Angenommen, Sie möchten sie nach der ID sortieren, die Sie schreiben würden ...

objArray.sort(function(a,b) {
    return a.id-b.id;
});
// objArray is now sorted by Id
zconnelly13
quelle
5
Er fragte nach der Sortierung nach Abteilungsname, nicht nach ID.
Paul Tomblin
Ich habe es versucht und dies scheint bei Zeichenfolgenspalten nicht zu funktionieren ... es hat bei einer Datumsspalte funktioniert. Was funktionierte, war die Lösung von @ omer-bokhari
tsando
-2

Nachdem ich ein wenig versucht und versucht hatte, so wenig Schleifen wie möglich zu erstellen, kam ich zu folgender Lösung:

Demo auf Codepen

const items = [
      {
        name: 'One'
      },
      {
        name: 'Maria is here'
      },
      {
        name: 'Another'
      },
      {
        name: 'Z with a z'
      },
      {
        name: '1 number'
      },
      {
        name: 'Two not a number'
      },
      {
        name: 'Third'
      },
      {
        name: 'Giant'
      }
    ];

    const sorted = items.sort((a, b) => {
      return a[name] > b[name];
    });

    let sortedAlphabetically = {};

    for(var item in sorted) {
      const firstLetter = sorted[item].name[0];
      if(sortedAlphabetically[firstLetter]) {
        sortedAlphabetically[firstLetter].push(sorted[item]);
      } else {
        sortedAlphabetically[firstLetter] = [sorted[item]]; 
      }
    }

    console.log('sorted', sortedAlphabetically);
Alexandre Magno Teles Zimerer
quelle
-3

Eine einfache Antwort:

objArray.sort(function(obj1, obj2) {
   return obj1.DepartmentName > obj2.DepartmentName;
});

ES6 Weg:

objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName};

Wenn Sie es in Klein- / Großbuchstaben usw. schreiben müssen, tun Sie dies einfach und speichern Sie das Ergebnis in einer Variablen, als Sie diese Variable vergleichen. Beispiel:

objArray.sort((obj1, obj2) => {
   var firstObj = obj1.toLowerCase();
   var secondObj = obj2.toLowerCase();
   return firstObj.DepartmentName > secondObj.DepartmentName;
});
Mascha
quelle