Learn JavaScript

Object.fromEntries() - метод для создания объекта из пар ключ-значение в JavaScript

Object.fromEntries() создаёт объект из списка пар [ключ, значение].

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

Синтаксис

Object.fromEntries(iterable)

iterable - это итерируемое значение, где каждый элемент является парой [ключ, значение].

Что делает Object.fromEntries()

Метод берёт пары ключ-значение и собирает из них обычный объект.

const entries = [
  ["name", "Anna"],
  ["age", 25],
];

const user = Object.fromEntries(entries);

console.log(user); // { name: "Anna", age: 25 }

Что возвращает Object.fromEntries()

Object.fromEntries() возвращает новый объект.

const result = Object.fromEntries([
  ["a", 1],
  ["b", 2],
]);

console.log(result); // { a: 1, b: 2 }

Это главное, что важно запомнить: результатом будет объект, а не массив.

Обратный метод к Object.entries()

Object.entries() превращает объект в массив пар.

Object.fromEntries() делает обратное.

const user = {
  name: "Anna",
  age: 25,
};

const entries = Object.entries(user);
const result = Object.fromEntries(entries);

console.log(entries); // [["name", "Anna"], ["age", 25]]
console.log(result);  // { name: "Anna", age: 25 }

Поэтому эти методы часто используют вместе.

Работа с Map

Object.fromEntries() умеет работать не только с массивом, но и с любым итерируемым значением, например с Map.

const map = new Map([
  ["name", "Anna"],
  ["age", 25],
]);

const user = Object.fromEntries(map);

console.log(user); // { name: "Anna", age: 25 }

Это один из самых полезных сценариев использования метода.

Преобразование объекта через entries

Очень частый сценарий выглядит так:

  1. взять объект через Object.entries()
  2. изменить пары через map() или filter()
  3. собрать новый объект через Object.fromEntries()

Пример:

const user = {
  name: "Anna",
  age: 25,
};

const upperUser = Object.fromEntries(
  Object.entries(user).map(([key, value]) => [key, String(value).toUpperCase()]),
);

console.log(upperUser); // { name: "ANNA", age: "25" }

Фильтрация свойств объекта

Через Object.fromEntries() удобно собирать объект после фильтрации.

const user = {
  name: "Anna",
  age: 25,
  city: "Moscow",
};

const shortUser = Object.fromEntries(
  Object.entries(user).filter(([key]) => key !== "city"),
);

console.log(shortUser); // { name: "Anna", age: 25 }

Это один из самых популярных практических примеров.

Если ключи повторяются

Если в списке есть одинаковые ключи, победит последнее значение.

const result = Object.fromEntries([
  ["name", "Anna"],
  ["name", "Ivan"],
]);

console.log(result); // { name: "Ivan" }

Более поздняя пара перезапишет более раннюю.

Ключи объекта

Ключами обычно становятся строки или символы.

Если в качестве ключа передать число, оно будет преобразовано в строку:

const result = Object.fromEntries([
  [1, "one"],
  [2, "two"],
]);

console.log(result); // { 1: "one", 2: "two" }

Object.fromEntries() не меняет исходные данные

Метод создаёт новый объект и не изменяет исходный массив пар или Map.

const entries = [
  ["a", 1],
  ["b", 2],
];

const result = Object.fromEntries(entries);

console.log(entries); // [["a", 1], ["b", 2]]
console.log(result);  // { a: 1, b: 2 }

Object.fromEntries() и Object.assign()

Оба метода могут привести к объекту, но работают по-разному.

const result = Object.fromEntries([
  ["name", "Anna"],
  ["age", 25],
]);

Object.fromEntries() собирает объект из пар.

Object.assign() копирует свойства из одного объекта в другой.

Это разные задачи.

Object.fromEntries() и reduce()

То же самое можно сделать через reduce(), но Object.fromEntries() обычно читается проще.

const entries = [
  ["name", "Anna"],
  ["age", 25],
];

const user = entries.reduce((acc, [key, value]) => {
  acc[key] = value;
  return acc;
}, {});

console.log(user); // { name: "Anna", age: 25 }

Через Object.fromEntries() этот код короче и понятнее.

Когда это полезно

Object.fromEntries() удобно использовать, когда:

  • нужно собрать объект из массива пар
  • нужно превратить Map в обычный объект
  • нужно отфильтровать или преобразовать объект через Object.entries()

Пример:

const settings = [
  ["theme", "dark"],
  ["lang", "ru"],
];

const config = Object.fromEntries(settings);

console.log(config); // { theme: "dark", lang: "ru" }

Частые ошибки

Думать, что метод принимает обычный объект

const user = {
  name: "Anna",
  age: 25,
};

// Object.fromEntries(user); // TypeError

Методу нужен не объект, а итерируемый список пар.

Забывать, что каждый элемент должен быть парой

// Object.fromEntries(["name", "Anna"]); // Ошибка

Элементы должны выглядеть как [key, value].

Не учитывать, что одинаковые ключи перезаписываются

const result = Object.fromEntries([
  ["name", "Anna"],
  ["name", "Ivan"],
]);

console.log(result); // { name: "Ivan" }

Последняя пара выигрывает.

Быстрая памятка

  • Object.fromEntries() создаёт объект из пар [ключ, значение]
  • метод принимает итерируемое значение, а не обычный объект
  • Object.entries() делает обратное преобразование
  • если ключи повторяются, побеждает последнее значение
  • метод особенно удобен вместе с map() и filter()

Коротко

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