FromEntries: примеры (JAVASCRIPT)

Метод Object.fromEntries для преобразования структур данных в JavaScript
Раздел: Объекты, Трансформация
fromEntries(iterable): object

Основы метода Object.fromEntries

Метод Object.fromEntries() преобразует список пар ключ-значение в объект. Он выполняет операцию, обратную методу Object.entries(), и был представлен в стандарте ES2019.

Использование функции актуально в случаях преобразования массивов, Map-объектов или других итерируемых структур в обычный JavaScript-объект. Это часто требуется после обработки данных методами массивов, такими как map или filter.

Синтаксис метода: Object.fromEntries(iterable).

Единственный аргумент iterable представляет собой итерируемый объект, содержащий элементы. Каждый элемент должен быть массивом или другим итерируемым объектом, содержащим ровно два элемента. Первый элемент пары становится ключом свойства объекта, второй - его значением.

Если в итерируемом объекте встречаются повторяющиеся ключи, значение для ключа будет взято из последней пары.

Метод возвращает новый объект, свойства которого созданы из пар ключ-значение переданного итерируемого объекта.

Базовые примеры использования

Преобразование массива массивов в объект:

const entries = [['name', 'Alex'], ['age', 30], ['city', 'Moscow']];
const obj = Object.fromEntries(entries);
console.log(obj);
{ name: "Alex", age: 30, city: "Moscow" }

Работа с объектом Map:

const map = new Map([
  ['color', 'blue'],
  ['size', 'large'],
  ['count', 5]
]);
const objFromMap = Object.fromEntries(map);
console.log(objFromMap);
{ color: "blue", size: "large", count: 5 }

Обработка дублирующихся ключей:

const duplicates = [['key', 'first'], ['key', 'last']];
const result = Object.fromEntries(duplicates);
console.log(result);
{ key: "last" }

Похожие функции в JavaScript

Object.entries() - выполняет обратную операцию, преобразуя объект в массив пар ключ-значение. Используется, когда нужна итерация по свойствам объекта с применением методов массивов.

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

Array.reduce() - может использоваться для достижения похожего результата при преобразовании массива в объект. Однако синтаксис с reduce обычно более многословен по сравнению с Object.fromEntries().

Выбор метода зависит от конкретной задачи. Object.fromEntries() наиболее удобен для простого преобразования структур данных. Map предпочтительнее при работе с ключами нестрокового типа или частом добавлении/удалении элементов.

Типичные ошибки

Передача массива с неправильной структурой элементов вызывает ошибку:

// Элементы должны содержать ровно два значения
Object.fromEntries([['key']]);
Uncaught TypeError: Iterator value key is not an entry object

Попытка использовать неитерируемый объект:

// Передача обычного объекта вместо итерируемого
Object.fromEntries({ a: 1, b: 2 });
Uncaught TypeError: object is not iterable

Использование объектов в качестве ключей. В отличие от Map, ключи в обычном объекте преобразуются в строки:

const keyObj = {};
const entries = [[keyObj, 'value']];
const result = Object.fromEntries(entries);
console.log(Object.keys(result)[0]);
"[object Object]"

Изменения в спецификации

Метод Object.fromEntries() был добавлен в стандарт ECMAScript 2019 (ES10). В более ранних версиях JavaScript этот метод отсутствовал.

С момента включения в спецификацию метод не претерпел существенных изменений в поведении. Полифилы для поддержки в старых браузерах обычно реализуют функцию через Array.reduce().

Расширенные примеры применения

Трансформация объекта после фильтрации свойств:

Пример javascript
const user = { id: 1, name: 'Olga', password: 'secret', email: 'test@example.com' };
// Удаляем поле password из объекта
const safeUser = Object.fromEntries(
  Object.entries(user).filter(([key]) => key !== 'password')
);
console.log(safeUser);
{ id: 1, name: "Olga", email: "test@example.com" }

Инверсия ключей и значений объекта:

Пример javascript
const original = { a: 1, b: 2, c: 3 };
const inverted = Object.fromEntries(
  Object.entries(original).map(([key, value]) => [value, key])
);
console.log(inverted);
{ "1": "a", "2": "b", "3": "c" }

Нормализация данных из формы:

Пример javascript
// Предположим, данные приходят как массив объектов {name, value}
const formData = [
  { name: 'username', value: 'john_doe' },
  { name: 'newsletter', value: 'on' },
  { name: 'theme', value: 'dark' }
];
const normalized = Object.fromEntries(
  formData.map(({name, value}) => [name, value])
);
console.log(normalized);
{ username: "john_doe", newsletter: "on", theme: "dark" }

Создание объекта с вычисляемыми ключами:

Пример javascript
const items = ['apple', 'banana', 'orange'];
const withPrices = Object.fromEntries(
  items.map(item => [`price_${item}`, Math.round(Math.random() * 100)])
);
console.log(withPrices);
{ price_apple: 23, price_banana: 87, price_orange: 42 }

Объединение нескольких источников данных:

Пример javascript
const baseSettings = [['theme', 'light'], ['lang', 'ru']];
const userSettings = [['theme', 'dark'], ['notifications', true]];
// User settings перезаписывают base settings
const finalSettings = Object.fromEntries([...baseSettings, ...userSettings]);
console.log(finalSettings);
{ theme: "dark", lang: "ru", notifications: true }

Аналоги в других языках программирования

В Python для создания словаря из списка кортежей используется конструктор dict():

entries = [('name', 'Anna'), ('age', 25)]
result = dict(entries)
print(result)
{'name': 'Anna', 'age': 25}

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

$keys = ['name', 'age'];
$values = ['Ivan', 35];
$result = array_combine($keys, $values);
print_r($result);
Array ( [name] => Ivan [age] => 35 )

В C# ( .NET ) метод ToDictionary() LINQ предоставляет похожую функциональность:

var entries = new List> {
    new KeyValuePair("name", "Maria"),
    new KeyValuePair("age", 28)
};
var dict = entries.ToDictionary(p => p.Key, p => p.Value);

Отличия от JavaScript реализации заключаются в основном в синтаксисе и необходимости явного указания типов данных в статически типизированных языках.

JS fromEntries function comments

En
FromEntries Transforms a list of key-value pairs into an object