web-dev-qa-db-fra.com

Trier un dictionnaire par valeur en JavaScript

Voici mon dictionnaire:

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

J'ai besoin d'un moyen de trier mon dictionnaire dict du plus petit au plus grand ou du plus grand au plus petit. Ou même ce serait bien que j'avais un tableau avec les clés triées dedans. Mais je ne sais pas comment faire une telle chose en utilisant javascript. Je l'ai fait avant d'utiliser python, comme ceci:

import heapq
from operator import itemgetter

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

Je l'ai cherché dans Google et j'ai constaté que les tableaux avaient la fonction sort() mais pas les dictionnaires. Ma question est donc la suivante: Comment puis-je trier le dictionnaire ou obtenir les 5 valeurs les plus importantes dans l’ordre de tri?

16
Michael

Il se peut que ce ne soit pas simple en JavaScript.

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

La première étape, la création d’un tableau d’articles, est similaire à celle de Python.

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

qui peut être écrit commodément comme

items = list(dict.items())

et l'étape de tri est similaire au tri de Python avec le paramètre cmp

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

et la dernière étape est similaire à l'opération de découpage en Python.

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

Vous pouvez essayer le code suivant. Il obtient un tableau entier trié par valeur. 

lien jsFiddle

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

J'espère que ça aide.

4
atur

À proprement parler, vous ne pouvez pas trier un "dictionnaire" (objet JavaScript), car les objets JavaScript n'ont pas d'ordre. Ils sont simplement un "sac" de paires clé/valeur.

Si vous voulez rechercher les n valeurs les plus grandes dans l'objet, vous devez, d'une manière ou d'une autre, convertir l'objet en un tableau dont les éléments sont ordonnés, comme avec la solution de @ thefourtheye. Si vous voulez trier les clés, alors, classez-les avec Object.keys(object).sort() comme une autre réponse vous montre comment faire.

2
user663031

Tout d’abord, ce que vous pouvez appeler un «dictionnaire» s’appelle un «objet» en JavaScript. Votre variable 'dict' est un objet. 

Les objets ne sont pas ordonnés dans JS, vous ne pouvez donc pas trier un objet. Heureusement, les tableaux sont ordonnés; nous allons convertir votre dictionnaire en tableau. Il suffit de regarder ci-dessous.

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

Vous pouvez l'essayerici

Si vous voulez changer le tri, regardez ici

Si vous voulez les cinq premières valeurs les plus grandes, eh bien, passez 5 fois sur boucleDict avec une boucle for et extrayez ces valeurs:

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

Rappelez-vous qu'en JavaScript, les objets ne sont pas ordonnés. Ils peuvent sembler avoir été commandés, mais ils ne le sont pas, et en fonction de l'implémentation JS de votre navigateur, leur ordre peut être différent. 

Sortedict est un tableau (qui est ordonné) et peut donc être trié. Dans chaque élément de ce tableau, vous trouverez une paire KEY et VALUE pour chaque paire de votre 'dictionnaire'.

2
Rayjax

La réponse fournie par @thefourtheye fonctionne dans une certaine mesure, mais elle ne renvoie pas la même structure de "dictionnaire". 

Si vous souhaitez retourner un objet trié avec la même structure que celle avec laquelle vous avez commencé , vous pouvez l'exécuter sur les éléments renvoyés par la réponse acceptée: 

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

Combinez-les pour une seule fonction qui trie un objet JavaScript

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

Exemple :

Simplement passez votre objet dans la fonction sort_object

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

sort_object(dict)

Résultat

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