it-swarm.com.de

Sortieren Sie ein Wörterbuch nach Wert in JavaScript

Hier ist mein Wörterbuch:

const dict = {
  "x" : 1,
  "y" : 6,
  "z" : 9,
  "a" : 5,
  "b" : 7,
  "c" : 11,
  "d" : 17,
  "t" : 3
};

Ich brauche einen Weg, um mein dict-Wörterbuch von den kleinsten zu den größten oder von den größten zu den geringsten zu sortieren. Oder sogar es wäre gut, ich hatte ein Array mit den sortierten Schlüsseln darin. Aber ich weiß nicht, wie ich das mit javascript mache. Ich habe es vor der Verwendung von python so gemacht:

import heapq
from operator import itemgetter

thirty_largest = heapq.nlargest(8, dict.iteritems(), key=itemgetter(1))

Ich habe in Google danach gesucht und festgestellt, dass Arrays die Funktion sort() haben, aber keine Wörterbücher. Meine Frage ist also: Wie kann ich das Wörterbuch sortieren oder die 5 größten Werte in der Sortierreihenfolge erhalten?

16
Michael

In JavaScript ist dies möglicherweise nicht direkt.

var dict = {
  "x": 1,
  "y": 6,
  "z": 9,
  "a": 5,
  "b": 7,
  "c": 11,
  "d": 17,
  "t": 3
};

// Create items array
var items = Object.keys(dict).map(function(key) {
  return [key, dict[key]];
});

// Sort the array based on the second element
items.sort(function(first, second) {
  return second[1] - first[1];
});

// Create a new array with only the first 5 items
console.log(items.slice(0, 5));

Der erste Schritt beim Erstellen eines Element-Arrays ähnelt dem von Python

items = map(lambda x: [x, var[x]], var.keys())

das kann bequem als geschrieben werden

items = list(dict.items())

und der Sortierschritt ähnelt der Sortierung von Python mit dem Parameter cmp

items.sort(cmp=lambda x, y: y[1] - x[1])

und der letzte Schritt ähnelt dem Slicing-Vorgang des Python.

print items[:5]
// [['d', 17], ['c', 11], ['z', 9], ['b', 7], ['y', 6]]
36
thefourtheye

Sie können den folgenden Code ausprobieren. Es wird ein ganzzahliges Array nach Wert sortiert. 

jsFiddle-Link

 function sortJsObject() {
    var dict = {"x" : 1, "y" : 6,  "z" : 9, "a" : 5, "b" : 7, "c" : 11, "d" : 17, "t" : 3};

    var keys = [];
    for(var key in dict) { 
       keys[keys.length] = key;
     }

     var values = [];     
     for(var i = 0; i < keys.length; i++) {
         values[values.length] = dict[keys [i]];
     }

     var sortedValues = values.sort(sortNumber);
     console.log(sortedValues);
}

// this is needed to sort values as integers
function sortNumber(a,b) {
   return a - b;
}

Ich hoffe es hilft.

4
atur

Streng genommen können Sie ein "Wörterbuch" (JavaScript-Objekt) nicht sortieren, da JavaScript-Objekte keine Reihenfolge haben. Sie sind lediglich eine "Tasche" von Schlüssel/Wert-Paaren.

Wenn Sie die n größten Werte im Objekt suchen möchten, müssen Sie das Objekt auf die eine oder andere Weise in ein Array konvertieren, dessen Elemente sind angeordnet sind, z. Wenn Sie die Schlüssel sortieren möchten, sortieren Sie sie mit Object.keys(object).sort(). Eine andere Antwort zeigt Ihnen, wie das geht.

2
user663031

Das Erste, was Sie als "Wörterbuch" bezeichnen können, wird in JavaScript als "Objekt" bezeichnet. Ihre Variable 'Dict' ist ein Objekt. 

Objekte sind in JS nicht geordnet, daher können Sie ein Objekt nicht sortieren. Zum Glück sind Arrays geordnet; Wir konvertieren Ihr Wörterbuch in ein Array. Schauen Sie sich einfach unten an.

//dict -> a js object
var dict = {"x" : 1,
        "y" : 6,
        "z" : 9,
        "a" : 5,
        "b" : 7,
        "c" : 11,
        "d" : 17,
        "t" : 3};

//Use the 'keys' function from the Object class to get the keys of your dictionary
//'keys' will be an array containing ["x", "y", "z"...]
var keys = Object.keys(dict);

//Get the number of keys - easy using the array 'length' property
var i, len = keys.length; 

//Sort the keys. We can use the sort() method because 'keys' is an array
keys.sort(); 

//This array will hold your key/value pairs in an ordered way
//it will be an array of objects
var sortedDict = [];

//Now let's go throught your keys in the sorted order
for (i = 0; i < len; i++)
{
    //get the current key
    k = keys[i];

    //show you the key and the value (retrieved by accessing dict with current key)
    alert(k + ':' + dict[k]);

    //Using the array 'Push' method, we add an object at the end of the result array
    //It will hold the key/value pair
    sortedDict.Push({'key': k, 'value':dict[k]});
}

//Result
console.log(sortedDict);

Du kannst es versuchenhier

Wenn Sie die Sortierung ändern wollen, werfen Sie einen Blick auf hier

Wenn Sie die ersten fünf größten Werte wünschen, führen Sie eine fünfmalige for-Schleife mit einer for-Schleife aus und holen Sie sich diese Werte heraus:

function getFiveFirstValues(){
    var valuesArray = [];
    for (i = 0; i < 5; i++)
    {
        valuesArray.Push(sortedDict[i].value);
    }
    return valuesArray;
}

Bitte denken Sie daran, dass in JavaScript Objekte UNORDERIERT sind. Sie scheinen wie bestellt zu sein, sind es aber nicht, und abhängig von der JS-Implementierung Ihres Browsers kann ihre Reihenfolge unterschiedlich sein. 

In diesem Beispiel ist sortedict ein Array (das geordnet ist) und kann daher sortiert werden. In jedem Element dieses Arrays finden Sie für jedes Paar Ihres 'Wörterbuchs' ein KEY- und VALUE-Paar.

2
Rayjax

Die Antwort von @thefourtheye funktioniert in gewissem Umfang, gibt jedoch nicht die gleiche "Wörterbuch" -Struktur zurück. 

Wenn Sie ein sortiertes Objekt mit derselben Struktur zurückgeben möchten, mit der Sie begonnen haben, können Sie dies für die Elemente ausführen, die von der akzeptierten Antwort zurückgegeben werden: 

sorted_obj={}
$.each(items, function(k, v) {
    use_key = v[0]
    use_value = v[1]
    sorted_obj[use_key] = use_value
})

Kombinieren Sie sie für ein einzelnes Funktion, die ein JavaScript-Objekt sortiert

function sort_object(obj) {
    items = Object.keys(obj).map(function(key) {
        return [key, obj[key]];
    });
    items.sort(function(first, second) {
        return second[1] - first[1];
    });
    sorted_obj={}
    $.each(items, function(k, v) {
        use_key = v[0]
        use_value = v[1]
        sorted_obj[use_key] = use_value
    })
    return(sorted_obj)
} 

Beispiel:

Einfach übergeben Sie Ihr Objekt in die sort_object-Funktion

dict = {
  "x" : 1,
  "y" : 6,
  "z" : 9,
  "a" : 5,
  "b" : 7,
  "c" : 11,
  "d" : 17,
  "t" : 3
};

sort_object(dict)

Ergebnis

{
"d":17,
"c":11,
"z":9,
"b":7,
"y":6,
"a":5,
"t":3,
"x":1
}
1
Cybernetic