Сортировка словаря по значению в 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]]
вы можете попробовать следующий код. Он получает отсортированный целочисленный массив по значению.
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 является массивом (который упорядочен) и, таким образом, может быть отсортирован. В каждом элементе этого массива вы найдете пару ключей и значений для каждой пары вашего "словаря".