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().
Расширенные примеры применения
Трансформация объекта после фильтрации свойств:
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" }Инверсия ключей и значений объекта:
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" }Нормализация данных из формы:
// Предположим, данные приходят как массив объектов {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" }Создание объекта с вычисляемыми ключами:
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 }Объединение нескольких источников данных:
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 реализации заключаются в основном в синтаксисе и необходимости явного указания типов данных в статически типизированных языках.