Хлопці, я образно шокований! Впевнені, що всі відповіді дещо старі, але ніхто не згадав про стабільність у сортуванні! Тож потерпіть зі мною, я постараюся зробити все можливе, щоб відповісти на запитання самого себе і розібратися тут у деталях. Тож я зараз вибачусь, читати буде багато.
Оскільки в 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 карт, то їх відносний порядок буде збережений, так що якщо один входив до іншого у введенні, він також прийти перед іншим у виході.
Приклад стабільного сортування на гральних картах. Коли карти сортуються за рангом із стабільним сортуванням, обидві 5s повинні залишатися в тому ж порядку у відсортованому виході, у якому вони були спочатку. Коли вони сортуються з нестабільним сортуванням, 5s можуть закінчитися протилежним порядку в відсортованому виході.
Це показує, що сортування правильне, але воно змінилося. Тож у реальному світі, навіть якщо сортування правильне, ми повинні переконатися, що ми отримаємо те, що очікуємо! Це дуже важливо, майте це на увазі також. Щоб отримати додаткові приклади JavaScript, перегляньте Array.prototype.sort () - документи: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort