эффективно сортировать словарь (или любую структуру данных значения ключа в js) по ключам word_number

как отсортировать словарь по ключу, как

dict["word_21"] = "Hello Java";
dict["word_22"] = "Hello World";
dict["word_11"] = "Hello Javascript";

так что я получаю

dict["word_22"] = "Hello World";
dict["word_21"] = "Hello Java";
dict["word_11"] = "Hello Javascript";

Комбинации word_number существуют только для индексов, а значения являются строками. Индексы различны (нет равных значений), но могут быть «неопределенными» в случае ошибки

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

 user105413408 июн. 2012 г., 13:31
именно так. Но и отмена заказа была бы отличной.
 sp00m08 июн. 2012 г., 13:25
Вы имеете в виду сортировку ключей по убыванию, сохраняя правильные пары ключ-значение, не так ли?

Ответы на вопрос(5)

Объект javascript, используемый здесь как карта значения ключа (называемый «словарь»), не имеет порядка; то есть. Вы не можете это отсортировать.

Для этого вам понадобится массив, например

[
    {id: "word_11", entry:"Hello Javascript"},
    {id: "word_21", entry:"Hello Java"},
    {id: "word_22", entry:"Hello World"},
]

тогда ты могсортировать это по ID или по записи. Вы могли бы использоватьваш id-sort-алгоритм для этого.

Или вы можете использовать массив ваших ключей для сортировки рядом с несортированной структурой данных. Это может быть лучший (эффективный) и самый простой подход:

var dict = {
    "word_21": "Hello Java",
    "word_22": "Hello World",
    "word_11": "Hello Javascript"
}; // init (like your example)

var keys = Object.keys(dict); // or loop over the object to get the array
// keys will be in any order
keys.sort(); // maybe use custom sort, to change direction use .reverse()
// keys now will be in wanted order

for (var i=0; i<keys.length; i++) { // now lets iterate in sort order
    var key = keys[i];
    var value = dict[key];
    /* do something with key & value here */
} 
 user105413408 июн. 2012 г., 14:08
что вы подразумеваете под "некоторыми реализациями"? которого?
 user105413408 июн. 2012 г., 14:59
хорошо, но я все еще не совсем уверен в том, что вы использовали в своем ответе. Это массив? извините, я новичок в javascript. Не могли бы вы дать мне ссылку на учебник для создания и доступа к таким массивам? Я нахожу только ассоциативные массивы, такие как assarr [& quot; word_11 & quot;] = & quot; Hello World & quot ;;
 user105413408 июн. 2012 г., 14:03
Предоставленный код Amberlamps работает довольно хорошо. Какое решение будет более эффективным?
 08 июн. 2012 г., 14:16
Javascript implementations нужно только следоватьecmascript standard, который определяет свойства этого объектаdo not have an order.
 08 июн. 2012 г., 14:06
@ Amberlamps & APOS; код не гарантированно работает (хотя в некоторых реализациях он работает). Вы действительно должны использовать массивы, когда вам нужно что-то с заказом.

Хорошее решение @Amberlamps работает большую часть времени. Но ОП правильно, что естьsplitting issues с определенными ключами. Поведение sort () по умолчанию в javascript заключается в использовании строковых кодовых точек Unicode для определения порядка элементов. Например, следующие ключи будутnot правильно отсортировать, используя метод @Amberlamps:

canvas_2_1/15/2018__2:55:20_PM

canvas_24_1/15/2018__2:55:20_PM

Но мы можем настроить метод сортировки, используя тот факт, что sort () принимаетoptional argument который являетсяfunction который сравнивает 2 элемента массива.

Настраивая логику сортировки функции сравнения и передавая ее методу sort (), приведенные выше ключи сортируются правильно:

sorted.sort(function(a, b) {
    a = parseInt(get_between(a, 'canvas_', '_'));
    b = parseInt(get_between(b, 'canvas_', '_'));
    if (a > b) {
        return 1;
    }
    if (b > a) {
        return -1;
    }
    return 0;
    });

В этом случае я использую следующий метод get_between:

function get_between(str, char_a, char_b) {
   res = str.split(char_a).pop().split(char_b).shift();
   return(res)
}

Дело в том, что если у вас есть хитрые ключи (которые могут или не могут быть «правильными» использованием dict), вы можете адаптировать функцию сортировки для правильной сортировки.

Проще говоря, тип словаря не имеет метода keys (), в то время как тип Object имеет. Вы можете передать метод Object.keys () итеративно и вернуть ключи в виде списка, в котором есть метод .sort ().

Object.keys({r:2,d:2,c:3,p:0})
// returns ["r", "d", "c", "p"]
Object.keys({r:2,d:2,c:3,p:0}).sort()
// returns ["c", "d", "p", "r"]
Object.keys([6,7,8,9])
// returns ["0", "1", "2", "3"]

И наконец, давайтеjsFiddle код OP.

Обновление: в ответе Берги было слишком много информации, и я полностью пропустил "хороший ответ" часть. Я даже не заметил, что он сделал то же самое, что и я в jsFiddle.

Решение Вопроса

Попробуй это

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

Сортировкаdict для его ключей и записи его обратно объекту не имеет смысла для меня, но здесь это идет:

function sortOnKeys(dict) {

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

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

    return tempDict;
}

dict = sortOnKeys(dict);
 08 июн. 2012 г., 12:39
Попытайся! .......
 user105413408 июн. 2012 г., 12:30
Я думаю, что это не сработает, потому что ключи должны быть разделены на "_" для того, чтобы быть отсортированы в числовом порядке
 08 июн. 2012 г., 13:06
Так не получится!dict остается нетронутым на протяжении всего процесса. После этого у вас есть дополнительный массивsorted который содержит ключи в отсортированном порядке.
 user105413408 июн. 2012 г., 12:47
извините, я новичок в JS. не могли бы вы исправить это наjsfiddle.net/eUvbx/2
 user105413408 июн. 2012 г., 13:10
Я понял, что вы имели в виду. Но это не совсем то, что мне нужно. В конце мне нужен тот же дикт, но отсортированный по ключу. Не только показатели. Я отредактировал свой вопрос, чтобы сделать его более понятным.

Если вы просто хотите отсортировать ключи в объекте, то все в порядке (это один слой)

/**
 * (typescript) returns the given object with keys sorted alphanumerically.
 * @param {T} obj the object to sort
 * @returns {T} the sorted object
 */
 const sort = <T extends object>(obj: T): T => Object.keys(obj).sort()
        .reduce((acc, c) => { acc[c] = obj[c]; return acc }, {}) as T

или то же самое в JavaScript

/**
 * (javascript) returns the given object with keys sorted alphanumerically.
 * @param {T} obj the object to sort
 * @returns {T} the sorted object
 */
 const sort = (obj) => Object.keys(obj).sort()
        .reduce((acc, c) => { acc[c] = obj[c]; return acc }, {})

Ваш ответ на вопрос