Ребята, я образно шокирован! Конечно, все ответы несколько устарели, но никто даже не упомянул стабильность в сортировке! Так что терпите меня, я сделаю все возможное, чтобы ответить на сам вопрос и уточнить детали здесь. Так что я собираюсь извиниться, сейчас будет много читать.
Так как это 2018, я буду использовать только ES6, все полифилы доступны в документах MDN, которые я привожу в данной части.
Ответ на вопрос:
Если ваши ключи - только цифры, вы можете безопасно использовать Object.keys()
вместе с Array.prototype.reduce()
для возврата отсортированного объекта:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
Однако, если вы работаете со строками, я настоятельно рекомендую объединить Array.prototype.sort()
во все это:
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
Если кому-то интересно, что делает уменьшение:
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
Если необходимо, вот пояснение для одного вкладыша:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
Почему сортировка немного сложна:
Вкратце Object.keys()
вернет массив в том же порядке, что и обычный цикл:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys () возвращает массив, элементы которого являются строками
соответствующие перечисляемым свойствам, найденным непосредственно на объекте.
Порядок свойств такой же, как и в цикле
над свойствами объекта вручную.
Sidenote - вы также можете использовать Object.keys()
для массивов, имейте в виду, что индекс будет возвращен:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
Но это не так легко показать на этих примерах, объекты реального мира могут содержать цифры и буквы или даже символы (пожалуйста, не делайте этого).
Вот пример со всеми из них в одном объекте:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
Теперь, если мы используем Array.prototype.sort()
в массиве выше, выходные данные изменятся:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
Вот цитата из документации:
Метод sort () сортирует элементы массива на месте и возвращает
массив. Сортировка не обязательно стабильна. Порядок сортировки по умолчанию
в соответствии со строкой кода Unicode.
Трудно гарантировать временную и пространственную сложность вида
зависит от реализации.
Вы должны убедиться, что один из них возвращает желаемый результат для вас. В реальных примерах люди склонны смешивать вещи, особенно если вы используете разные информационные входы, такие как API и базы данных вместе.
Так в чем же дело?
Ну, есть две статьи, которые должен понять каждый программист:
Алгоритм на месте :
В компьютерной науке алгоритм на месте - это алгоритм, который преобразует входные данные без использования вспомогательной структуры данных. Однако для вспомогательных переменных допускается небольшое количество дополнительного пространства для хранения. Входные данные обычно перезаписываются выходными данными при выполнении алгоритма. Алгоритм на месте обновляет входную последовательность только путем замены или замены элементов. Алгоритм, который не на месте, иногда называют не на месте или не на месте.
Так что в основном наш старый массив будет перезаписан! Это важно, если вы хотите сохранить старый массив по другим причинам. Так что имейте это в виду.
Алгоритм сортировки
Стабильные алгоритмы сортировки сортируют идентичные элементы в том же порядке, что
они появляются на входе. При сортировке некоторых видов данных, только часть
данных проверяется при определении порядка сортировки. Например,
в примере сортировки карт справа карты сортируются
их рангом, и их иск игнорируется. Это позволяет
возможность нескольких разных правильно отсортированных версий
Оригинальный список. Стабильные алгоритмы сортировки выбирают один из них,
согласно следующему правилу: если два элемента сравниваются как равные, какдве 5 карт, то их относительный порядок будет сохранен, так что если одна из них была перед другой на входе, она также будет стоять перед другой на выходе.
Пример стабильной сортировки на игральных картах.Когда карты отсортированы по рангу со стабильной сортировкой, две 5 должны оставаться в том же порядке в отсортированном выводе, в котором они были изначально. Когда они сортируются с нестабильной сортировкой, эти 5 могут оказаться в противоположномпорядок в отсортированном выводе.
Это показывает, что сортировка верна, но она изменилась.Таким образом, в реальном мире, даже если сортировка правильная, мы должны убедиться, что получаем то, что ожидаем!Это очень важно, имейте это в виду.Дополнительные примеры JavaScript можно найти в Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort