Пользовательская функция сортировки ведет себя по-разному для строковых и цифровых клавиш

С помощью различных онлайн-источников я создал собственную функцию сортировки. Это работает правильно, когда объект для сортировки имеет строковые ключи. Однако сортировка по убыванию не выполняется, если ключи объекта являются числовыми.

const sortObjectByKey = (obj, direction = 'asc') => {
    const keys = Object.keys(obj).sort();
    if (direction == 'desc') keys.reverse();
    // return keys;
    const sortedObject = {};
    for (value of keys) {
        sortedObject[value] = obj[value];
    }
    return sortedObject;
}

const y = { 'zebra': 'runs', 'anteater': 'eats', 'kangaroo': 'hops', 'bovine': 'moos' };
console.info(sortObjectByKey(y));
console.info(sortObjectByKey(y, 'desc'));

const x = { 2021: 'twenty one', 2020: 'twenty', 2019: 'nineteen', 2023: 'twenty three', 2022: 'twenty two', 2018: 'eighteen' };
console.info(sortObjectByKey(x));
console.info(sortObjectByKey(x, 'desc'));

Почему сортировка по убыванию не соблюдается, когда ключи объекта являются числовыми?

Просто выбрасывая это туда, объекты в JavaScript не сортируются. Это может быть журналирование в отсортированном порядке, но такая сортировка не гарантируется. Если вам нужна сортировка, вы должны использовать массив.

tymeJV 09.02.2023 22:42

потому что Object не использует структуру массива.

Mister Jojo 09.02.2023 22:47

порядок индекса, как значения/положительные 32-битные целые числа, сортируются сначала по порядку, затем следуют другие числа и строки в порядке вставки, за которыми следуют символы.

Nina Scholz 09.02.2023 22:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Порядок обхода объекта:

Порядок обхода, согласно современной спецификации ECMAScript, таков: четко определены и согласованы между реализациями. В каждом компонент цепочки прототипов, все неотрицательные целочисленные ключи (те, которые могут быть индексами массива) будут проходиться первыми в порядке возрастания по значению, затем другие строковые ключи в возрастающем хронологическом порядке создание собственности

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

Следовательно, пользовательский порядок цифровых клавиш не будет соблюдаться во время обхода.

console.info({2:'two', 1:'one'})

// prints {1:'one', 2:'two'} instead of {2:'two', 1:'one'}

Другие вопросы по теме