Найти индекс класса в массиве классов. На чистом JS

Есть такая html структура

<div class="className">1</div>
<div class="className">2</div>
<div class="className className_active">3</div>
<div class="className">4</div>
<div class="className">5</div>
<div class="className">6</div>
<div class="className">7</div>

Необходимо найти индекс класса className_active в массиве classNames;

let active = document.getElementsByClassName('className_active');
let classNames = document.querySelectorAll('.className');
let index = classNames.indexOf(active);

Ответы (3 шт):

Автор решения: WVFFLIFE

const index = [...document.querySelectorAll('.className')]
  .findIndex(element => element.className.includes('className_active'));

console.log(index);
<div class="className">1</div>
<div class="className">2</div>
<div class="className className_active">3</div>
<div class="className">4</div>
<div class="className">5</div>
<div class="className">6</div>
<div class="className">7</div>

→ Ссылка
Автор решения: Alex Sazonov

classNames это не массив. Это коллекция. Чтобы его в массив переделать, надо либо деструктурировать, либо Array.from() использовать. getElementsByClassName тоже возвращает не массив, а коллекцию. И так не получится искать индекс коллекции в коллекции. Поэтому вот ниже я сначала нашёл обычным квериСелектором нужный элемент, потому что он (querySelector) возвращает первое вхождение, потом сделал массив из коллекции, а потом уже нашел, где он лежит. То есть код практически не изменился в плане логики работы, просто не правильно использовались некоторые методы :)

let active = document.querySelector('.className_active');
let classNames = [...document.querySelectorAll('.className')];
// let classNames = Array.from(document.querySelectorAll('.className')); То же самое, но выше просто запись красивее, лаконичнее.
let index = classNames.indexOf(active);

console.log(index);
<div class="className">1</div>
<div class="className">2</div>
<div class="className className_active">3</div>
<div class="className">4</div>
<div class="className">5</div>
<div class="className">6</div>
<div class="className">7</div>

→ Ссылка
Автор решения: OPTIMUS PRIME

Если у объекта нет какого-то метода, можно взять его у другого объекта и вызвать в нужном контексте. indexOf() есть у массивов. Достать оттуда → Array.prototype.indexOf, и вызвать через Function.prototype.call() — где первый аргумент - объект, в контексте которого нужно вызвать функцию, а все последующие - аргументы этой функции.

var classNames = document.querySelectorAll('.className');
var active = document.querySelector('.className.active');

var index = Array.prototype.indexOf.call(classNames, active);
     // как-бы → classNames.indexOf(active);

console.log( index );
.active { color: red; }
<div class="className">0</div>
<div class="className">1</div>
<div class="className active">2</div>
<div class="className">3</div>
<div class="className">4</div>
<div class="className">5</div>
<div class="className">6</div>

P.s. Для данной задачи легче превратить ваш список в обычный массив, как уже отвечали. Но полезно знать и про call.

→ Ссылка