← Все вопросы

querySelectorAll не работает с forEach или map — почему и как обойти?

Задан 20 месяцев назад651 просмотров4 ответа
12

Беру все элементы через document.querySelectorAll('.item') и хочу пройтись циклом. forEach вроде работает, а map/filter ругаются, что это не функция. Это же массив?

4 ответа

21
✓ Принятый ответ — помог автору

querySelectorAll возвращает не массив, а NodeList — похожий на массив объект. У NodeList есть forEach (поэтому он и работает), но НЕТ map, filter, reduce и прочих методов массива.

Если нужны эти методы — сначала преврати NodeList в настоящий массив:

const items = document.querySelectorAll('.item');

// вариант 1: спред
const arr = [...items];

// вариант 2: Array.from
const arr2 = Array.from(items);

arr.map(el => el.textContent); // теперь работает

Кстати, getElementsByClassName возвращает HTMLCollection — у него нет даже forEach, так что там превращение в массив обязательно.

Егор Гутников ещё момент: NodeList от querySelectorAll статичный, а HTMLCollection живой и обновляется при изменении DOM · 19 месяцев назад
Алексей Царев [...nodeList] — самый короткий способ · 19 месяцев назад
8

Это NodeList, а не массив. forEach у него есть, остального нет. Оберни в Array.from(...) или [...] и получишь все методы массива.

4

[...document.querySelectorAll('.item')].map(...).

-2

Используй обычный for по индексу: for (let i = 0; i < list.length; i++) — NodeList же индексируется как массив.

Егор Иванов работать-то будет, но вопрос был именно про map/filter; для них всё равно нужен Array.from, цикл их не вернёт · 19 месяцев назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект