Guten Morgen, ich habe ein Problem damit, herauszufinden, wie der folgende JSON sortiert wird

{
    "135": {"name": "marco", "title": "foo"},
    "223": {"name": "wilco", "title": "bar"},
    "322": {"name": "enola", "title": "baz"}
}

Ich möchte nach Namen (und manchmal nach möglichen Titeln) sortieren. Die gesamte Zeile sollte jedoch sortiert werden. Soll ich dies zuerst in ein geeignetes Array konvertieren?

Vielen Dank!

0
Marco 10 Okt. 2012 im 11:34

4 Antworten

Beste Antwort

Sie können niemals ein Objekt sortieren. Sie müssen dies in ein Array konvertieren.

Für dieses spezielle Problem, wenn Sie das Objekt nicht in ein Array ändern können.

Sie können dem folgen,

var obj = { 
    "223": {"name": "wilco", "title": "bar"},
    "322": {"name": "enola", "title": "baz"},
    "135": {"name": "marco", "title": "foo"}
};

var arr = [];
for(var i in obj) {
    var o = {};
    if(obj.hasOwnProperty(i)) {
       o.id = i;
       o.name = obj[i].name;
       o.title = obj[i].title;
       arr.push(o); 
    }        
} 
arr.sort(function (a,b) {
   a.id - b.id;
});
console.log(arr);

Demo

1
Jashwant 10 Okt. 2012 im 08:01

Sie können versuchen, Ihre Objekt-Requisiten zu sortieren, ohne ein Array zu erstellen. Das Schreiben kostet jedoch mehr Codezeilen, und Sie müssen auf Ihre Eigenschaften achten, damit sie nicht von anderen Objekten geerbt werden. Sie müssen also für in Schleife verwenden:

for (var prop in obj) {
  if(obj.hasOwnProperty(prop)) {
    //perform sorting...
  }
}

Oder Sie können Ihr Objekt in ein Array umwandeln und Daten über die Standard-Sortierfunktion für js-Arrays sortieren:

function sortObj(obj) {
  var objToArr = [],
  prop,
  sortedObj = {};
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        objToArr.push([prop, obj[prop]]);
    }
   }

 objToArr.sort(function(a, b) { return a[0] - b[0]; });
 objToArr.forEach(function (val, key) {
   sortedObj[val[0]] = sortedObj[val[1]];
 });
 return sortedObj;
}

Sie können diese Funktion für komplexere Objekte übernehmen, z. B. wenn eine Eigenschaft eines Objekts ein anderes Objekt enthält usw.

1
happyCoda 10 Okt. 2012 im 08:01

Möglicherweise möchten Sie einen Unterstrich anzeigen, der Ihnen die Arbeit mit Objekten / Arrays erleichtert. Ja, Sie müssen es zu einem Array machen, damit Sie es sogar zuverlässig bestellen / sortieren können.

var array=[];
for (var i in obj){
    if (obj.hasOwnProperty(i)){
        obj[i].id=i;
        array.push(obj[i]);
    }
}
var fieldToSort="id"; //or "title" or "name"
array.sort(function(a,b){
    return a[fieldToSort] - b[fieldToSort];
});
1
japrescott 10 Okt. 2012 im 07:43

Sollte ich dies zuerst in ein richtiges Array konvertieren?

Ja, da Objekte keine Ordnung garantieren. Außerdem müssten Sie die Struktur ein wenig ändern:

[
    {"id":"135", "name": "marco", "title": "foo"},
    {"id":"223", "name": "wilco", "title": "bar"},
    {"id":"322", "name": "enola", "title": "baz"}
]

Was Sortieralgorithmen betrifft, gibt es im Web eine Menge, insbesondere diesen.

3
Community 23 Mai 2017 im 11:44