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

Ссылка скопирована
1 ответ

Здравствуйте.

Я пытаюсь объединить два объекта в один, но элементы автоматически сортируются. (сначала выводятся свойства, у которых ключи - это Цифры, потом идут свойства, у которых ключи - это буквы). Мне нужно наоборот.

Мне нужен новый объект , где сначала будут идти свойства , у которых ключи - Буквы, а потом уже свойства, у которых ключи - Цифры.

Я пробовал объединять через Object.assign(), spread оператор, но все равно сначала выводяться свойства, у которых ключ - это цифра.

Подскажите пожалуйста, как можно это исправить?

https://jsfiddle.net/IvanGrishov/dskjefa9/1/

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

Дополнительно:

Этот вопрос тут задают регулярно.
Порядок ключей в объекте задан в стандарте и там явно написано что «числовые ключи» идут первыми и отсортированы по возрастанию. Остальные отсортированы в порядке добавления.

https://tc39.es/ecma262/multipage/ordinary-and-exo...

  • Lynn «Кофеман», спасибо. А есть способ "числовые ключи" в конец добавить, после "буквенных"?
  • Иван Гришов, для чего? Порядок в объекте не играет никакой роли.
  • Иван Гришов, не нужно этого хотеть

    Если важен порядок, то не пользуйся объектом

  • Иван Гришов, если так важно числовые ключи в конец, то можно им добавить текстовый префикс, чтобы они не считались числами... Ну или поместить их в отдельное дочернее поле:

    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.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Максим Павлов Ответ

    При объединении двух объектов в один, они не автоматически сортируются. Возможно, вы наблюдаете какой-то другой процесс или поведение, которое приводит к сортировке объектов.

    Если вы работаете с массивами объектов и объединяете их с помощью функции 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;

    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;

    Таким образом, если вам необходимо сохранить порядок элементов при объединении объектов, вам следует обратить внимание на способ объединения и возможные перезаписи значений.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно