Перейти к основному содержимому

`Object.fromEntries`

· 3 мин. чтения
Матиас Биненс ([@mathias](https://twitter.com/mathias)), шептун JavaScript

Object.fromEntries — это полезное дополнение к встроенной библиотеке JavaScript. Перед тем как объяснить, что он делает, важно понять существующий API Object.entries.

Object.entries

API Object.entries существует уже некоторое время.

Для каждой пары ключ-значение в объекте Object.entries предоставляет массив, где первый элемент — это ключ, а второй элемент — значение.

Object.entries особенно полезен в сочетании с for-of, так как он позволяет элегантно проходить по всем парам ключ-значение в объекте:

const object = { x: 42, y: 50 };
const entries = Object.entries(object);
// → [['x', 42], ['y', 50]]

for (const [key, value] of entries) {
console.log(`Значение ${key} равно ${value}.`);
}
// Результат:
// Значение x равно 42.
// Значение y равно 50.

К сожалению, нет простого способа преобразовать результат entries обратно в эквивалентный объект… до настоящего момента!

Object.fromEntries

Новый API Object.fromEntries выполняет обратное преобразование от Object.entries. Это делает легким восстановление объекта на основе его пар:

const object = { x: 42, y: 50 };
const entries = Object.entries(object);
// → [['x', 42], ['y', 50]]

const result = Object.fromEntries(entries);
// → { x: 42, y: 50 }

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

const object = { x: 42, y: 50, abc: 9001 };
const result = Object.fromEntries(
Object.entries(object)
.filter(([ key, value ]) => key.length === 1)
.map(([ key, value ]) => [ key, value * 2 ])
);
// → { x: 84, y: 100 }

В этом примере мы фильтруем объект, чтобы оставить только ключи длиной 1, то есть только ключи x и y, исключая ключ abc. Затем мы преобразуем оставшиеся пары и возвращаем обновленные пары ключ-значение для каждой. В этом примере мы удваиваем каждое значение, умножая его на 2. Конечный результат — новый объект, содержащий только свойства x и y с новыми значениями.

Объекты против карт

JavaScript также поддерживает Map, которые зачастую являются более подходящей структурой данных, чем обычные объекты. Поэтому в коде, который полностью под вашим контролем, вы можете использовать карты вместо объектов. Однако у разработчика не всегда есть выбор представления. Иногда данные, с которыми вы работаете, поступают из внешнего API или из функции библиотеки, которая возвращает объект вместо карты.

Object.entries упрощает преобразование объектов в карты:

const object = { language: 'JavaScript', coolness: 9001 };

// Преобразовать объект в карту:
const map = new Map(Object.entries(object));

Обратное преобразование тоже полезно: даже если ваш код использует карты, вы сможете сериализовать свои данные, например, чтобы превратить их в JSON и отправить запрос API. Или, возможно, вам нужно передать данные в другую библиотеку, которая ожидает объект вместо карты. В этих случаях вам нужно создать объект на основе данных карты. Object.fromEntries делает это элементарным:

// Преобразовать карту обратно в объект:
const objectCopy = Object.fromEntries(map);
// → { language: 'JavaScript', coolness: 9001 }

С помощью Object.entries и Object.fromEntries в языке вы легко можете преобразовывать между картами и объектами.

Предупреждение: будьте осторожны с потерей данных

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

const map = new Map([
[{}, 'a'],
[{}, 'b'],
]);
Object.fromEntries(map);
// → { '[object Object]': 'b' }
// Примечание: значение 'a' не найдено, так как оба ключа
// преобразуются в строку с одинаковым значением '[object Object]'.

Перед использованием Object.fromEntries или любого другого метода преобразования карты в объект убедитесь, что ключи карты дают уникальные результаты toString.

Поддержка Object.fromEntries