Что делает Object.keys/Object.values/Object.entries с массивом?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#JavaScript #Массивы #Объекты #База JS

Краткий ответ

Массивы в JavaScript — это специальные объекты, поэтому методы [Object.keys], [Object.values], [Object.entries] работают и с ними:

  1. Object.keys(arr) — возвращает индексы как строки 🔑
  2. Object.values(arr) — возвращает значения элементов 📦
  3. Object.entries(arr) — возвращает пары [индекс, значение] 🔄
const arr = ['a', 'b', 'c'];
 
Object.keys(arr);     // ['0', '1', '2'] — индексы
Object.values(arr);   // ['a', 'b', 'c'] — значения
Object.entries(arr);  // [['0','a'], ['1','b'], ['2','c']] — пары

Полный ответ

Массивы в JavaScript — это как особенные объекты с номерными “карманами”. Методы [Object.*] работают с ними как с обычными объектами! 📦🔢

Object.keys с массивом

Возвращает все “имена карманов” (индексы) в виде строк:

const fruits = ['яблоко', 'банан', 'апельсин'];
 
console.log(Object.keys(fruits)); 
// ['0', '1', '2'] — индексы как строки!
 
// Пропущенные элементы не учитываются
const sparse = ['a', , 'c']; // "дырявый" массив
console.log(Object.keys(sparse)); 
// ['0', '2'] — только существующие индексы

Object.values с массивом

Возвращает значения всех элементов:

const fruits = ['яблоко', 'банан', 'апельсин'];
 
console.log(Object.values(fruits)); 
// ['яблоко', 'банан', 'апельсин'] — как arr.slice()
 
// Пропущенные элементы тоже не учитываются
const sparse = ['a', , 'c'];
console.log(Object.values(sparse)); 
// ['a', 'c'] — только существующие значения

Object.entries с массивом

Возвращает массив пар [индекс, значение]:

const fruits = ['яблоко', 'банан', 'апельсин'];
 
console.log(Object.entries(fruits)); 
// [['0', 'яблоко'], ['1', 'банан'], ['2', 'апельсин']]
 
// Удобно для перебора с индексами
Object.entries(fruits).forEach(([index, value]) => {
  console.log(`${index}: ${value}`);
});
// 0: яблоко
// 1: банан
// 2: апельсин

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

Для работы с индексами

// ✅ Когда нужны индексы как массив
const arr = ['a', 'b', 'c'];
const indices = Object.keys(arr); // ['0', '1', '2']
 
// Лучше, чем делать цикл для получения индексов

Для фильтрации по индексам

// ✅ Оставить только чётные индексы
const arr = ['a', 'b', 'c', 'd'];
const evenIndexed = Object.entries(arr)
  .filter(([index]) => index % 2 === 0)
  .map(([, value]) => value);
  
console.log(evenIndexed); // ['a', 'c']

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

Думать, что keys возвращает числа

const arr = ['a', 'b', 'c'];
const keys = Object.keys(arr);
 
// ❌ Ошибка — это строки!
console.log(keys[0] + 1); // '01', а не 1!
 
// ✅ Правильно — преобразовать в число
console.log(+keys[0] + 1); // 1

Путать с обычными методами массива

const arr = ['a', 'b', 'c'];
 
// ❌ Не то же самое!
Object.values(arr); // ['a', 'b', 'c']
arr.slice();        // ['a', 'b', 'c'] — то же самое, но понятнее
 
// Object.values полезен в основном с объектами

Простые правила

  1. Object.keys — возвращает индексы как строки 🔑
  2. Object.values — возвращает значения элементов 📦
  3. Object.entries — возвращает пары [индекс, значение] 🔄
  4. Индексы — строки — не забывай про тип! ⚠️
  5. Пропуски игнорируются — дырявые массивы обрабатываются правильно ✅
  6. Для объектов чаще — с массивами есть специальные методы 🎯

Понимание работы Object.* методов с массивами помогает лучше понимать, как устроены массивы в JavaScript! 💡


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪