Сортировка словаря по значению в JavaScript

вот мой словарь:

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

мне нужен способ сортировки dict словарь от наименьшего к наибольшему или от наибольшего к наименьшему. Или даже было бы хорошо, если бы у меня был массив с отсортированными ключами. Но я не знаю, как это сделать, используя javascript. Я сделал это перед использованием python, например:

import heapq
from operator import itemgetter

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

Я искал его в Google, и я обнаружил, что массивы имеют sort() функция, но не словари. Итак, мой вопрос:: как я могу сортировать словарь или получить ТОП-5 самых больших значений в порядке сортировки?

4 ответов


это может быть не прямо вперед в 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));

первый шаг, создание массива элементов, подобное в Python

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

который можно удобно написать как

items = list(dict.items())

и шаг сортировки аналогичен сортировке Python с cmp параметр

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

и последний шаг похож на операцию нарезки Python.

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

вы можете попробовать следующий код. Он получает отсортированный целочисленный массив по значению.

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

надеюсь, что это помогает.


строго говоря, вы не можете сортировать "словарь" (объект JavaScript), потому что объекты JavaScript не имеют порядка. Они просто "мешок" пар ключ / значение.

Если вы хотите найти n наибольших значений в объекте, то так или иначе вам нужно преобразовать объект в массив, элементы которого are приказано, например, с решением @thefourtheye. Если вы хотите отсортировать ключи, тогда хорошо, отсортируйте их с помощью Object.keys(object).sort() как другой ответ показывает вам, как к.


объекты не упорядочены в JS, поэтому вы не можете сортировать объект. К счастью!--5-->массивы упорядочены; мы преобразуем ваш словарь в массив. Просто взгляните вниз.

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

вы можете попробовать здесь

если вы хотите изменить порядок сортировки, посмотрите здесь

если вы хотите первые пять самых больших значений, ну, цикл над sortedDict с циклом for 5 раз и получить эти значения:

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

пожалуйста, помните, что в JavaScript объекты неупорядочены. они могут казаться заказанными, но они не являются, и в зависимости от JS реализация Вашего браузера их порядок может быть разным.

в этом примере, sortedDict является массивом (который упорядочен) и, таким образом, может быть отсортирован. В каждом элементе этого массива вы найдете пару ключей и значений для каждой пары вашего "словаря".