Происходит автоматическая сортировка свойств объекта из-за того, что ключи целочисленные (т.е. преобразуемые в 32-битные целые числа, не превышающие 2^32 - 1) обрабатываются и хранятся по-особому. Они располагаются в порядке возрастания перед остальными свойствами, которые упорядочиваются в порядке создания. Если ключ объекта можно представить как целочисленный индекс, то он будет особым образом упорядочен в объекте.
Чтобы решить вашу задачу, есть несколько способов. Простейший из них – добавить префикс к ключам-числам, чтобы JavaScript-движок трактовал их как обычные строки, не подвергая специальной сортировке.
В вашем случае код на JSFiddle можно модифицировать следующим образом:
```javascript
const object1 = {
'a': 'somestring',
'b': 42
};
const object2 = {
'c': false,
'd': true
};
const numericObject = {
2: 'foo',
1: 'bar'
};
// Функция для добавления префикса к ключам
function addPrefixToKeys(obj, prefix) {
return Object.keys(obj).reduce((res, key) => {
res[prefix + key] = obj[key];
return res;
}, {});
}
// Добавляем префикс 'num_' к числовым ключам
const prefixedNumericObject = addPrefixToKeys(numericObject, 'num_');
// Объединяем объекты
const mergedObject = {
...object1,
...object2,
...prefixedNumericObject
};
console.log(mergedObject);
```
Теперь ключи `'1'` и `'2'` станут `'num_1'` и `'num_2'`, соответственно, и они будут восприниматься как обычные строковые ключи. Обратите внимание, что данный подход меняет исходные ключи, возможно, вам придется учитывать это при дальнейшей работе с объектом.
Если вы хотите сохранить исходные значения ключей, вы можете преобразовать объект в Map, который сохраняет порядок вставки ключей в дополнение к возможности использовать ключи любых типов.