Почему при объединении двух объектов в один они автоматически сортируются?
Здравствуйте.
Я пытаюсь объединить два объекта в один, но элементы автоматически сортируются. (сначала выводятся свойства, у которых ключи - это Цифры, потом идут свойства, у которых ключи - это буквы). Мне нужно наоборот.
Мне нужен новый объект , где сначала будут идти свойства , у которых ключи - Буквы, а потом уже свойства, у которых ключи - Цифры.
Я пробовал объединять через Object.assign(), spread оператор, но все равно сначала выводяться свойства, у которых ключ - это цифра.
Подскажите пожалуйста, как можно это исправить?
https://jsfiddle.net/IvanGrishov/dskjefa9/1/
Дополнительно:
Этот вопрос тут задают регулярно.
Порядок ключей в объекте задан в стандарте и там явно написано что «числовые ключи» идут первыми и отсортированы по возрастанию. Остальные отсортированы в порядке добавления.
https://tc39.es/ecma262/multipage/ordinary-and-exo...
Если важен порядок, то не пользуйся объектом
concatObj = { ...letterObj, numbered: numberObj };
Но есть решение и с другого боку: взять и отсортировать ключи по своему вкусу и уже по ним итерироваться.
По стандарту ECMAScript 2023 список ключей объекта формируется в определённом порядке:
10.1.11.1 OrdinaryOwnPropertyKeys ( O )
The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object) and returns a List of property keys. It performs the following steps when called:
1. Let keys be a new empty List.
2. For each own property key P of O such that P is an array index, in ascending numeric index order, do
a. Append P to keys.
3. For each own property key P of O such that P is a String and P is not an array index, in ascending chronological order of property creation, do
a. Append P to keys.
4. For each own property key P of O such that P is a Symbol, in ascending chronological order of property creation, do
a. Append P to keys.
5. 5. Return keys.
- спасибо за информацию, для меня это было новостью.
По итогу я переделал объект в массив и уже далее работал с массивом. Все отсортировал и решил задачу.
Ответы:
для обычных объектов никак, Map итерируется в порядке добавления
- Выходит самый простой способ сортировки - работа со списком ключей объекта? Ну и практически единственный.
- Kentavr16, я бы скорее предпочёл формат, который выдаёт aMap.entries() или Object.entries(), т.е. массив пар [ ключ, значение, ] — порядок можно сделать какой угодно, но не будет доступа по ключу
с другой стороны, если что-то зависит от порядка ключей в объекте, то скорее всего это что-то сломано
- Map тут не при чём, в примере обычный Object.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

При объединении двух объектов в один, они не автоматически сортируются. Возможно, вы наблюдаете какой-то другой процесс или поведение, которое приводит к сортировке объектов.
Если вы работаете с массивами объектов и объединяете их с помощью функции array_merge() или оператора "+", то порядок элементов может измениться в зависимости от способа объединения. Например, при использовании array_merge() элементы из первого массива останутся на своих местах, а элементы из второго массива будут добавлены в конец. Однако, если в обоих массивах есть элементы с одинаковыми ключами, то значения из второго массива перезапишут значения из первого.
Если вы работаете с объектами и используете оператор "+", то объекты объединяются как массивы, и порядок элементов сохраняется. Однако, если у вас есть одинаковые ключи, то значения из второго объекта перезапишут значения из первого.
Если вам нужно объединить два объекта без изменения порядка элементов, вам следует использовать другой подход, например, создать новый объект и скопировать в него свойства из двух исходных объектов.
Пример на PHP:
class MyClass { public $property1; public $property2; } $obj1 = new MyClass(); $obj1->property1 = 'value1'; $obj1->property2 = 'value2'; $obj2 = new MyClass(); $obj2->property1 = 'value3'; $obj2->property2 = 'value4'; $newObj = new MyClass(); $newObj->property1 = $obj1->property1 . $obj2->property1; $newObj->property2 = $obj1->property2 . $obj2->property2;
Таким образом, если вам необходимо сохранить порядок элементов при объединении объектов, вам следует обратить внимание на способ объединения и возможные перезаписи значений.