Object.entries() возвращает массив пар [ключ, значение] объекта.
Это очень удобный метод, когда нужны сразу и ключи, и значения, особенно для перебора через for...of, map() или reduce().
Синтаксис
Object.entries(obj)
obj - объект, у которого нужно получить пары ключ-значение.
Что делает Object.entries()
Метод берёт объект и возвращает массив, где каждый элемент - это пара [ключ, значение].
const user = {
name: "Anna",
age: 25,
};
console.log(Object.entries(user));
// [["name", "Anna"], ["age", 25]]
Что возвращает Object.entries()
Object.entries() всегда возвращает массив.
Причём внутри этого массива лежат другие массивы из двух элементов:
- ключ
- значение
const result = Object.entries({ a: 1, b: 2 });
console.log(result); // [["a", 1], ["b", 2]]
console.log(Array.isArray(result)); // true
Это главное, что важно запомнить: результатом будет массив пар.
Только собственные свойства
Object.entries() возвращает только собственные свойства объекта.
Свойства из прототипа в результат не попадают.
const base = { role: "user" };
const person = Object.create(base);
person.name = "Anna";
console.log(Object.entries(person)); // [["name", "Anna"]]
Пара ["role", "user"] сюда не попала, потому что это свойство находится в прототипе.
Только перечисляемые свойства
Метод возвращает только перечисляемые свойства.
Если свойство сделано неперечисляемым, в результат оно не попадёт.
const user = { name: "Anna" };
Object.defineProperty(user, "secret", {
value: "123",
enumerable: false,
});
console.log(Object.entries(user)); // [["name", "Anna"]]
Пустой объект
Если у объекта нет своих перечисляемых свойств, метод вернёт пустой массив.
console.log(Object.entries({})); // []
Object.entries() не меняет объект
Метод только читает данные и не изменяет сам объект.
const user = { name: "Anna", age: 25 };
const entries = Object.entries(user);
console.log(user); // { name: "Anna", age: 25 }
console.log(entries); // [["name", "Anna"], ["age", 25]]
Перебор через for…of
Один из самых удобных сценариев - перебрать объект через деструктуризацию.
const user = {
name: "Anna",
age: 25,
};
for (const [key, value] of Object.entries(user)) {
console.log(key, value);
}
Это читается очень удобно, когда нужны сразу и ключ, и значение.
Преобразование объекта
Object.entries() часто используют, когда объект нужно превратить в массив и обработать как обычные данные.
const scores = {
math: 90,
english: 85,
};
const result = Object.entries(scores).map(([key, value]) => {
return `${key}: ${value}`;
});
console.log(result); // ["math: 90", "english: 85"]
Object.entries(), Object.keys() и Object.values()
Это три близких метода, но возвращают они разное:
Object.keys()- ключиObject.values()- значенияObject.entries()- пары[ключ, значение]
Пример:
const user = {
name: "Anna",
age: 25,
};
console.log(Object.keys(user)); // ["name", "age"]
console.log(Object.values(user)); // ["Anna", 25]
console.log(Object.entries(user)); // [["name", "Anna"], ["age", 25]]
Порядок пар
Пары возвращаются в том же порядке, в котором идут свойства объекта.
const obj = {
first: 1,
second: 2,
third: 3,
};
console.log(Object.entries(obj));
// [["first", 1], ["second", 2], ["third", 3]]
Массивы и Object.entries()
Массив тоже является объектом, поэтому метод работает и с ним.
const arr = ["a", "b", "c"];
console.log(Object.entries(arr));
// [["0", "a"], ["1", "b"], ["2", "c"]]
Важно помнить, что индексы здесь приходят как строки.
Строка как аргумент
Если передать строку, JavaScript обернёт её в объект и вернёт пары индекс-символ.
console.log(Object.entries("hi")); // [["0", "h"], ["1", "i"]]
Для других примитивов результат обычно будет пустым массивом:
console.log(Object.entries(123)); // []
console.log(Object.entries(true)); // []
А вот null и undefined вызовут ошибку:
// Object.entries(null); // TypeError
// Object.entries(undefined); // TypeError
Символы не попадают в результат
Object.entries() работает только со строковыми перечисляемыми ключами.
Свойства с ключами-символами сюда не входят.
const id = Symbol("id");
const user = {
name: "Anna",
[id]: 1,
};
console.log(Object.entries(user)); // [["name", "Anna"]]
Когда это полезно
Object.entries() удобно использовать, когда:
- нужны одновременно и ключи, и значения
- хочется перебрать объект через
for...of - нужно превратить объект в массив для
map(),filter()илиreduce()
Пример:
const settings = {
theme: "dark",
lang: "ru",
};
const lines = Object.entries(settings).map(([key, value]) => `${key}: ${value}`);
console.log(lines); // ["theme: dark", "lang: ru"]
Частые ошибки
Думать, что Object.entries() возвращает объект
const result = Object.entries({ a: 1 });
console.log(result); // [["a", 1]]
Это массив, а не объект.
Путать Object.entries() и Object.values()
const user = { name: "Anna" };
console.log(Object.entries(user)); // [["name", "Anna"]]
Если нужен только список значений, нужен Object.values().
Забывать, что свойства из прототипа не попадают в результат
const base = { role: "user" };
const person = Object.create(base);
person.name = "Anna";
console.log(Object.entries(person)); // [["name", "Anna"]]
Наследуемые свойства сюда не входят.
Быстрая памятка
Object.entries()возвращает массив пар[ключ, значение]- в результат попадают только собственные перечисляемые строковые свойства
- свойства из прототипа не попадают
- массивы и строки тоже поддерживаются
- метод особенно удобен для перебора через деструктуризацию
Коротко
Object.entries() - это удобный способ получить сразу и ключи, и значения объекта. Главное, что стоит запомнить: метод возвращает массив пар [ключ, значение], с которым особенно удобно работать через for...of, map() и reduce().