JavaScript-Objekt nach Eigenschaftenwert sortieren



Answers

Wir möchten nicht die gesamte Datenstruktur duplizieren oder ein Array verwenden, für das wir ein assoziatives Array benötigen.

Hier ist ein anderer Weg, um das gleiche wie Bonna zu tun:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
alert(keysSorted);     // bar,me,you,foo
Question

Wenn ich ein JavaScript-Objekt habe wie:

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

Gibt es eine Möglichkeit, die Eigenschaften nach Wert zu sortieren? Damit ich am Ende bin

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};

Ich habe einen wirklich hirnverbrannten Moment dabei.




Hier ist ein weiteres Beispiel:

function sortObject(obj) {
  var arr = [];
  var prop;
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      arr.push({
        'key': prop,
        'value': obj[prop]
      });
    }
  }
  arr.sort(function(a, b) {
    return a.value - b.value;
  });
  return arr; // returns array
}
var list = {
  car: 300,
  bike: 60,
  motorbike: 200,
  airplane: 1000,
  helicopter: 400,
  rocket: 8 * 60 * 60
};
var arr = sortObject(list);
console.log(arr);




Versuche dies

    var speed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var sortable = [];
for (var vehicle in speed) {
    sortable.push([vehicle, speed[vehicle]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});



Mit query-js können Sie es so machen

list.keys().select(function(k){
    return {
        key: k,
        value : list[k]
    }
}).orderBy(function(e){ return e.value;});

Hier finden Sie einen einführenden Artikel zu query-js




Ich folge der Lösung von slebetman (lesen Sie es für alle Details), aber angepasst, da Ihr Objekt nicht verschachtelt ist.

// First create the array of keys/values so that we can sort it:
var sort_array = [];
for (var key in list) {
    sort_array.push({key:key,value:list[key]});
}

// Now sort it:
sort_array.sort(function(x,y){return x.value - y.value});

// Now process that object with it:
for (var i=0;i<sort_array.length;i++) {
    var item = list[sort_array[i].key];

    // now do stuff with each item
}



Objekt nach Wert sortiert (DESC)

function sortObject(list) {
  var sortable = [];
  for (var key in list) {
    sortable.push([key, list[key]]);
  }

  sortable.sort(function(a, b) {
    return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
  });

  var orderedList = {};
  for (var i = 0; i < sortable.length; i++) {
    orderedList[sortable[i][0]] = sortable[i][1];
  }

  return orderedList;
}



Das ECMAScript 2017 führt Object.values / Object.entries . Wie der Name andeutet, fasst der erstere alle Werte eines Objekts zu einem Array zusammen, während der zweite das gesamte Objekt in ein Array von [key, value] Arrays umwandelt; Pythons Äquivalent zu dict.values() und dict.items() .

Die Funktionen erleichtern das Sortieren von Hashwerten in ein geordnetes Objekt. Derzeit unterstützt nur ein kleiner Teil der JavaScript-Plattformen sie , aber Sie können es auf Firefox 47+ versuchen.

let obj = {"you": 100, "me": 75, "foo": 116, "bar": 15};

let entries = Object.entries(obj);
// [["you",100],["me",75],["foo",116],["bar",15]]

let sorted = entries.sort((a, b) => a[1] - b[1]);
// [["bar",15],["me",75],["you",100],["foo",116]]



Der Vollständigkeit halber gibt diese Funktion ein sortiertes Array von Objekteigenschaften zurück:

function sortObject(obj) {
    var arr = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            arr.push({
                'key': prop,
                'value': obj[prop]
            });
        }
    }
    arr.sort(function(a, b) { return a.value - b.value; });
    //arr.sort(function(a, b) { a.value.toLowerCase().localeCompare(b.value.toLowerCase()); }); //use this to sort as strings
    return arr; // returns array
}

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var arr = sortObject(list);
console.log(arr); // [{key:"bar", value:15}, {key:"me", value:75}, {key:"you", value:100}, {key:"foo", value:116}]

Jfiddle mit dem obigen Code ist hier . Diese Lösung basiert auf diesem Artikel .

Aktualisierte Geige zum Sortieren von Strings ist hier. Sie können beide zusätzlichen .toLowerCase () - Konvertierungen für die Groß- / Kleinschreibung zwischen Groß- und Kleinschreibung entfernen.




Eine "Pfeil" - Version der answer von @marcusR als Referenz

var myObj = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(myObj).sort((a,b) => myObj[a]-myObj[b])
alert(keysSorted);     // bar,me,you,foo

UPDATE: EDIT April 2017 - Dies gibt ein sortiertes Objekt myObj , das oben definiert wurde.

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {})

Probieren Sie es hier aus!




Eine andere Möglichkeit, dies zu lösen: -

var res = [{"s1":5},{"s2":3},{"s3":8}].sort(function(obj1,obj2){ 
 var prop1;
 var prop2;
 for(prop in obj1) {
  prop1=prop;
 }
 for(prop in obj2) {
  prop2=prop;
 }
 //the above two for loops will iterate only once because we use it to find the key
 return obj1[prop1]-obj2[prop2];
});

// res wird das Ergebnis-Array haben




Versuche dies. Selbst Ihr Objekt hat nicht die Eigenschaft, auf der Sie versuchen zu sortieren, auch behandelt werden.

Rufen Sie es einfach auf, indem Sie die Eigenschaft mit dem Objekt senden.

var sortObjectByProperty = function(property,object){

    console.time("Sorting");
    var  sortedList      = [];
         emptyProperty   = [];
         tempObject      = [];
         nullProperty    = [];
    $.each(object,function(index,entry){
        if(entry.hasOwnProperty(property)){
            var propertyValue = entry[property];
            if(propertyValue!="" && propertyValue!=null){
              sortedList.push({key:propertyValue.toLowerCase().trim(),value:entry});  
            }else{
                emptyProperty.push(entry);
           }
        }else{
            nullProperty.push(entry);
        }
    });

      sortedList.sort(function(a,b){
           return a.key < b.key ? -1 : 1;
         //return a.key < b.key?-1:1;   // Asc 
         //return a.key < b.key?1:-1;  // Desc
      });


    $.each(sortedList,function(key,entry){
        tempObject[tempObject.length] = entry.value;
     });

    if(emptyProperty.length>0){
        tempObject.concat(emptyProperty);
    }
    if(nullProperty.length>0){
        tempObject.concat(nullProperty);
    }
    console.timeEnd("Sorting");
    return tempObject;
}



var list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

function sortAssocObject(list) {
    var sortable = [];
    for (var key in list) {
        sortable.push([key, list[key]]);
    }

    sortable.sort(function(a, b) {
        return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));
    });

    var orderedList = {};
    for (var i = 0; i < sortable.length; i++) {
        orderedList[sortable[i][0]] = sortable[i][1];
    }

    return orderedList;
}

sortAssocObject(list);

// {bar: 15, me: 75, you: 100, foo: 116}



Links