it-swarm.com.de

JavaScript-Objekt nach Eigenschaftswert sortieren

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 ende

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

Verschieben Sie sie in ein Array, sortieren Sie das Array und verwenden Sie dieses Array für Ihre Zwecke. Hier ist eine Lösung:

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

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

//[["bike", 60], ["motorbike", 200], ["car", 300],
//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

Sobald Sie das Array haben, können Sie das Objekt in der von Ihnen gewünschten Reihenfolge aus dem Array neu erstellen und so genau das erreichen, was Sie vorhaben. Das würde in allen Browsern funktionieren, die ich kenne, aber es wäre abhängig von einer Implementierungsspirale und könnte jederzeit brechen. Sie sollten niemals Annahmen über die Reihenfolge von Elementen in einem JavaScript-Objekt treffen.

563
Nosredna

Wir möchten nicht die gesamte Datenstruktur duplizieren oder ein Array verwenden, bei dem wir ein assoziatives Array benötigen.

Hier ist eine andere Möglichkeit, 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]})
console.log(keysSorted);     // bar,me,you,foo

342
Markus R

Ihre Objekte können beliebig viele Eigenschaften haben. Sie können nach beliebiger Objekteigenschaft, Nummer oder Zeichenfolge sortieren, wenn Sie die Objekte in ein Array einfügen. Betrachten Sie dieses Array:

var arrayOfObjects = [   
    {
        name: 'Diana',
        born: 1373925600000, // Mon, Jul 15 2013
        num: 4,
        sex: 'female'
    },
    {

        name: 'Beyonce',
        born: 1366832953000, // Wed, Apr 24 2013
        num: 2,
        sex: 'female'
    },
    {            
        name: 'Albert',
        born: 1370288700000, // Mon, Jun 3 2013
        num: 3,
        sex: 'male'
    },    
    {
        name: 'Doris',
        born: 1354412087000, // Sat, Dec 1 2012
        num: 1,
        sex: 'female'
    }
];

sortieren nach Geburtsdatum, älteste zuerst

// use slice() to copy the array and not just make a reference
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a,b) {
    return a.born - b.born;
});
console.log('by date:');
console.log(byDate);

nach Name sortieren

var byName = arrayOfObjects.slice(0);
byName.sort(function(a,b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('by name:');
console.log(byName);

http://jsfiddle.net/xsM5s/16/

163
inorganik

Der Vollständigkeit halber gibt diese Funktion ein sortiertes Array der 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}]

Jsfiddle mit dem Code oben ist hier . Diese Lösung basiert auf diesem Artikel .

Geänderte Geige zum Sortieren von Strings ist hier. Sie können beide .toLowerCase () -Konvertierungen daraus entfernen, um die Groß- und Kleinschreibung zu berücksichtigen.

58
Stano

JavaScript-Objekte sind per Definition ungeordnet (siehe ECMAScript-Sprache Spezifikation , Abschnitt 8.6). Die Sprachspezifikation garantiert nicht einmal, dass, wenn Sie die Eigenschaften eines Objekts zweimal hintereinander durchlaufen, diese beim zweiten Mal in derselben Reihenfolge angezeigt werden.

Wenn Sie etwas bestellen möchten, verwenden Sie ein Array und die Methode Array.prototype.sort.

36
NickFitz

Eine "Pfeil" -Version von @marcusRs answer 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: April 2017 - Dies gibt ein sortiertes myObj-Objekt zurück, das oben definiert wurde.

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

Versuch es hier!

UPDATE: Oktober 2018 - Version von Object.entries

Object
 .entries(myObj)
 .sort()
 .reduce((_sortedObj, [k,v]) => ({
   ..._sortedObj, 
   [k]: v
 }), {})

Versuch es hier!

27
Jason J. Nathan

OK, wie Sie vielleicht wissen, hat Javascript die Funktion sort (), um Arrays zu sortieren, aber nichts für das Objekt ...

In diesem Fall müssen wir also ein Array der Schlüssel abrufen und diese sortieren. Das ist der Grund, weshalb die Apis Ihnen meistens Objekte in einem Array gibt, weil Array mehr native Funktionen hat, um mit ihnen zu spielen als das Objektliteral. Die schnelle Lösung verwendet Object.key, die ein Array der Objektschlüssel zurückgeben. Ich erstelle die Funktion ES6, unter der die Aufgabe für Sie erledigt wird. Sie verwendet native sort ( ) und verkleinern () Funktionen in Javascript:

function sortObject(obj) {
  return Object.keys(obj)
    .sort().reduce((a, v) => {
    a[v] = obj[v];
    return a; }, {});
}

Und jetzt kannst du es so benutzen:

let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);

Überprüfen Sie das sortierteMeinObjekt und Sie können das Ergebnis nach Schlüsseln wie folgt sortieren:

{a: 1, b: 2, c: 3, d: 4, e: 5}

Auch auf diese Weise wird das Hauptobjekt nicht berührt und wir erhalten tatsächlich ein neues Objekt.

Ich erstelle das Bild unten, um die Funktionsschritte klarer zu machen, falls Sie es etwas ändern müssen, um es nach Ihren Wünschen zu bearbeiten:

 Sorting a javascript object by property value

20
Alireza

ECMAScript 2017 führt Object.values / Object.entries ein. Wie der Name vermuten lässt, aggregiert der erstere alle Werte eines Objekts in einem Array und der letztere führt das gesamte Objekt in ein Array von [key, value]-Arrays aus. Pythons Äquivalent zu dict.values() und dict.items() .

Die Funktionen erleichtern das Sortieren von Hashs in ein geordnetes Objekt. Derzeit unterstützt nur ein kleiner Teil der JavaScript-Plattformen , aber Sie können es mit 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]]
17
kiding
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}
7
Vasil Nikolov

Underscore.js oder Lodash.js für erweiterte Array- oder Objektsortierungen

 var data={
        "models": {

            "LTI": [
                "TX"
            ],
            "Carado": [
                "A",
                "T",
                "A(пасс)",
                "A(груз)",
                "T(пасс)",
                "T(груз)",
                "A",
                "T"
            ],
            "SPARK": [
                "SP110C 2",
                "sp150r 18"
            ],
            "Autobianchi": [
                "A112"
            ]
        }
    };

    var arr=[],
        obj={};
    for(var i in data.models){
      arr.Push([i, _.sortBy(data.models[i],function (el){return el;})]);
    }
    arr=_.sortBy(arr,function (el){
      return el[0];
    });
    _.map(arr,function (el){return obj[el[0]]=el[1];});
     console.log(obj);

Demo

6
Roman Yudin

Update mit ES6: Wenn Ihr Anliegen ein sortiertes Objekt zum Durchlaufen hat (weshalb ich mir vorstellen kann, dass Sie Ihre Objekteigenschaften sortieren möchten), können Sie das Map object verwenden. 

Sie können Ihre (Schlüssel-, Wert-) Paare in sortierter Reihenfolge einfügen. Wenn Sie dann eine for..of-Schleife ausführen, wird garantie die Schleife in der Reihenfolge, in der Sie sie eingefügt haben

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 0 = zero 
// 1 = one
6
julianljk

Ich folge der Lösung, die von slebetman gegeben wurde (lesen Sie 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
}
5
bonna

Dies könnte eine einfache Methode sein, um es als ein echtes geordnetes Objekt zu behandeln. Nicht sicher, wie langsam es ist. könnte auch mit einer while-Schleife besser sein.

Object.sortByKeys = function(myObj){
  var keys = Object.keys(myObj)
  keys.sort()
  var sortedObject = Object()
  for(i in keys){
    key = keys[i]
    sortedObject[key]=myObj[key]
   }

  return sortedObject

}

Und dann fand ich diese Umkehrfunktion von: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/

Object.invert = function (obj) {

  var new_obj = {};

  for (var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      new_obj[obj[prop]] = prop;
    }
  }

  return new_obj;
};

So 

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var invertedList = Object.invert(list)
var invertedOrderedList = Object.sortByKeys(invertedList)
var orderedList = Object.invert(invertedOrderedList)
2
Carson Wright

viele ähnliche und nützliche Funktionen: https://github.com/shimondoodkin/groupbyfunctions/

function sortobj(obj)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        if(a[1]>b[1]) return -1;if(a[1]<b[1]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

function sortobjkey(obj,key)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        k=key;      if(a[1][k]>b[1][k]) return -1;if(a[1][k]<b[1][k]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}
1
Shimon Doodkin

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;
}
1
victorhazbun

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

1

Mit query-js können Sie das so machen

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

Einen einführenden Artikel zu query-js finden Sie hier

0
Rune FS

Ein anderer Weg, dieses Problem 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 hat das Ergebnisfeld

0
vivek_nk

Sehr kurz und einfach!

      var sortedList = {};
  Object.keys(list).sort((a,b)=>{return list[a]-list[b]}).forEach((key) => {
    sortedList[key] = list[key];
  })
0
Maryam Koulaei

Versuche dies. Selbst wenn Ihr Objekt nicht über die Eigenschaft verfügt, auf deren Grundlage Sie zu sortieren versuchen, wird ebenfalls behandelt. 

Rufen Sie es einfach an, 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;
}
0
Vali Shah
function sortObjByValue(list){
 var sortedObj = {}
 Object.keys(list)
  .map(key => [key, list[key]])
  .sort((a,b) => a[1] > b[1] ? 1 : a[1] < b[1] ? -1 : 0)
  .forEach(data => sortedObj[data[0]] = data[1]);
 return sortedObj;
}
sortObjByValue(list);

Github Gist Link

0
Ankit Sinha

hier ist der Weg, um das Objekt zu sortieren und im Gegenzug ein sortiertes Objekt zu erhalten

let sortedObject = {}
sortedObject = Object.keys(yourObject).sort((a, b) => {
                        return yourObject[a] - yourObject[b] 
                    }).reduce((prev, curr, i) => {
                        prev[i] = yourObject[curr]
                        return prev
                    }, {});

sie können Ihre Sortierfunktion an Ihre Anforderungen anpassen

0
Ashutosh Ranjan
var list = {
    "you": 100,
    "me": 75,
    "foo": 116,
    "bar": 15
};
var tmpList = {};
while (Object.keys(list).length) {
    var key = Object.keys(list).reduce((a, b) => list[a] > list[b] ? a : b);
    tmpList[key] = list[key];
    delete list[key];
}
list = tmpList;
console.log(list); // { foo: 116, you: 100, me: 75, bar: 15 }
0
Milad Aslani

Sortiere Werte ohne mehrere for-Schleifen (um nach den Schlüsseln zu sortieren, ändere den Index im Sortier-Callback auf "0")

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

let sorted = Object.fromEntries(
                Object.entries(list).sort( (a,b) => a[1] - b[1] )    
             ) 
console.log('Sorted object: ', sorted) 
0
dino4udo

Konnte keine Antwort darüber finden, würde sowohl funktionieren als auch SMALL sein und nterstützung verschachtelter Objekte (keine Arrays), also ich schrieb meine eigene :) Funktioniert sowohl mit Strings als auch mit Ints.

  function sortObjectProperties(obj, sortValue){
      var keysSorted = Object.keys(obj).sort(function(a,b){return obj[a][sortValue]-obj[b][sortValue]});
      var objSorted = {};
      for(var i = 0; i < keysSorted.length; i++){
          objSorted[keysSorted[i]] = obj[keysSorted[i]];
      }
      return objSorted;
    }

Verwendungszweck:

    /* sample object with unsorder properties, that we want to sort by 
    their "customValue" property */

    var objUnsorted = {
       prop1 : {
          customValue : 'ZZ'
       },
       prop2 : {
          customValue : 'AA'
       }
    }

    // call the function, passing object and property with it should be sorted out
    var objSorted = sortObjectProperties(objUnsorted, 'customValue');

    // now console.log(objSorted) will return:
    { 
       prop2 : {
          customValue : 'AA'
       },
       prop1 : {
          customValue : 'ZZ'
       } 
    }
0
Paul Walczewski

Für den Fall, dass jemand das Objekt behalten möchte (mit Schlüsseln und Werten), verwenden Sie die Codereferenz von @ Markus R und den Kommentar von @ James Moran. Verwenden Sie einfach:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var newO = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newO[key] = list[key]);
console.log(newO);  // {bar: 15, me: 75, you: 100, foo: 116}
0
esneyderp

Ich habe dafür ein Plugin erstellt, das 1 Argument akzeptiert, das ein unsortiertes Objekt ist, und ein Objekt zurückgibt, das nach dem Prop-Wert sortiert wurde. Dies funktioniert bei allen 2 dimensionalen Objekten wie {"Nick": 28, "Bob": 52}...

var sloppyObj = {
    'C': 78,
    'A': 3,
    'B': 4
};

// Extend object to support sort method
function sortObj(obj) {
    "use strict";

    function Obj2Array(obj) {
        var newObj = [];
        for (var key in obj) {
            if (!obj.hasOwnProperty(key)) return;
            var value = [key, obj[key]];
            newObj.Push(value);
        }
        return newObj;
    }

    var sortedArray = Obj2Array(obj).sort(function(a, b) {
        if (a[1] < b[1]) return -1;
        if (a[1] > b[1]) return 1;
        return 0;
    });

    function recreateSortedObject(targ) {
        var sortedObj = {};
        for (var i = 0; i < targ.length; i++) {
            sortedObj[targ[i][0]] = targ[i][1];
        }
        return sortedObj;
    }
    return recreateSortedObject(sortedArray);
}

var sortedObj = sortObj(sloppyObj);

alert(JSON.stringify(sortedObj));

Hier ist eine Demo der Funktion, die wie erwartet funktionierthttp://codepen.io/nicholasabrams/pen/RWRqve?editors=001

0
Alpha G33k

Vielen Dank und antworten Sie weiter @Nosredna

Nachdem wir verstanden haben, dass das Objekt in ein Array konvertiert werden muss, sortieren Sie das Array. Dies ist nützlich, um ein Array (oder ein konvertiertes Objekt in ein Array) nach Zeichenfolge zu sortieren: 

Object {6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object}
   6: Object
   id: "6"
   name: "PhD"
   obe_service_type_id: "2"
   __proto__: Object
   7: Object
   id: "7"
   name: "BVC (BPTC)"
   obe_service_type_id: "2"
   __proto__: Object


    //Sort options
    var sortable = [];
    for (var vehicle in options)
    sortable.Push([vehicle, options[vehicle]]);
    sortable.sort(function(a, b) {
        return a[1].name < b[1].name ? -1 : 1;
    });


    //sortable => prints  
[Array[2], Array[2], Array[2], Array[2], Array[2], Array[2], Array[2]]
    0: Array[2]
    0: "11"
    1: Object
        id: "11"
        name: "AS/A2"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
        __proto__: Array[0]
    1: Array[2]
    0: "7"
    1: Object
        id: "7"
        name: "BVC (BPTC)"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
0
Fury