Learn JavaScript

entries() - метод для перебора пар индекс-значение массива в JavaScript

entries() возвращает итератор, который по очереди отдаёт пары [индекс, значение] для элементов массива.

Этот метод удобен, когда во время перебора нужен и сам элемент, и его индекс.

Синтаксис

array.entries()

Метод не принимает аргументов.

Что делает entries()

entries() создаёт специальный объект-итератор.

При каждом следующем шаге он возвращает массив из двух элементов:

  • индекс
  • значение по этому индексу

Пример:

const iterator = ["a", "b"].entries();

console.log(iterator.next()); // { value: [0, "a"], done: false }
console.log(iterator.next()); // { value: [1, "b"], done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Что возвращает entries()

Метод возвращает не обычный массив, а итератор.

Это важный момент:

const result = ["apple", "banana"].entries();

console.log(result);
// Array Iterator {}

Поэтому с ним обычно работают через for...of или Array.from().

Перебор через for…of

Самый удобный и частый вариант использования - пройтись по массиву и сразу получить индекс и значение.

const fruits = ["apple", "banana", "orange"];

for (const [index, fruit] of fruits.entries()) {
  console.log(index, fruit);
}

Результат:

0 "apple"
1 "banana"
2 "orange"

Преобразование в обычный массив

Если нужен именно обычный массив, итератор можно развернуть:

const result = Array.from(["a", "b", "c"].entries());

console.log(result);
// [[0, "a"], [1, "b"], [2, "c"]]

То же самое можно сделать через spread:

const result = [...["a", "b"].entries()];

console.log(result); // [[0, "a"], [1, "b"]]

entries() не меняет исходный массив

Метод только создаёт итератор и не изменяет массив.

const numbers = [10, 20, 30];
const iterator = numbers.entries();

console.log(numbers); // [10, 20, 30]

Сам массив остаётся прежним.

Пустые слоты

entries() проходит и по пустым слотам массива.

const arr = Array(3);

console.log(Array.from(arr.entries()));
// [[0, undefined], [1, undefined], [2, undefined]]

Это важное отличие от forEach(), который пустые слоты пропускает.

entries() и keys() / values()

Если нужен только индекс, чаще используют keys().

Если нужно только значение, используют values().

entries() полезен именно тогда, когда нужны оба сразу.

const numbers = [10, 20];

console.log([...numbers.entries()]); // [[0, 10], [1, 20]]

Итератор расходуется

Итератор нельзя использовать бесконечно. После полного прохода он считается исчерпанным.

const iterator = ["a", "b"].entries();

console.log([...iterator]); // [[0, "a"], [1, "b"]]
console.log([...iterator]); // []

Если нужен новый проход, нужно снова вызвать entries().

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

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

  • нужен и индекс, и значение элемента
  • хочется перебирать массив через for...of
  • нужно получить пары [индекс, значение] в виде структуры данных

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

Думать, что entries() возвращает массив

const result = [1, 2, 3].entries();

console.log(result); // Array Iterator {}

Если нужен обычный массив, его надо развернуть через Array.from() или spread.

Забывать, что итератор одноразовый

const iterator = ["a", "b"].entries();

console.log([...iterator]); // [[0, "a"], [1, "b"]]
console.log([...iterator]); // []

После полного прохода этот же итератор уже пустой.

Путать с Object.entries()

const arr = ["a", "b"];

console.log([...arr.entries()]); // [[0, "a"], [1, "b"]]

entries() у массива работает с индексами массива, а Object.entries() - это отдельный статический метод для объектов.

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

  • entries() возвращает итератор, а не массив
  • итератор отдаёт пары [индекс, значение]
  • метод не меняет исходный массив
  • чаще всего entries() используют вместе с for...of
  • пустые слоты массива тоже участвуют в переборе

Коротко

entries() - это удобный способ получить индекс и значение каждого элемента массива одновременно. Главное, что стоит запомнить: метод возвращает не массив, а итератор, с которым обычно работают через for...of, Array.from() или spread.