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.