Элемент IndexOf в массиве [duplicate]

На этот вопрос уже есть ответ здесь:

Результат `document.getElementsByClassName` не имеет методов массива, таких как` map`, даже если это массив 1 ответ

Я пытаюсь получить индекс из массива элементов.

 var arr = document.getElementsByClassName('class'); //3 elements

 console.log(arr);
 output// [div.class.selected, div.class, div.class, item: function, namedItem: function]

 var selected = document.getElementsByClassName('selected');
 var selected_id = arr.indexOf(selected[0]); 

Последняя строка кода дает мне ошибкуUncaught TypeError: undefined is not a function, Я тоже пытался добавитьtoString() и поиск, но ошибка та же.

Ответы на вопрос(3)

Это потому чтоarr является (живым) NodeList, а не массивом; то, что вы хотите, я думаю:

console.log([].indexOf.call(arr, selected[0]));

 var arr = document.getElementsByClassName('class');
 var selected = document.getElementsByClassName('selected');
 var selected_id = [].indexOf.call(arr, selected[0]);
 console.log(selected_id);
<div class="class"></div><div class="class"></div><div class="class selected"></div><div class="class"></div>

Линия:

var selected_id = [].indexOf.call(arr, selected[0]);

Использует роднойArray.prototype.indexOf() метод, поставляющийarr какthis (в основном используяarr как массив, на котором вызывается метод), поставляяselected[0] в качестве аргумента, передаваемого методу, таквроде, как бы, что-то вроде применяется, как вы сами это называли:

var selected_id = arr.indexOf(selected[0]);

но делает это таким образом, что признаетindexOf() метод недоступен дляNodeList объект (вызывая его законным способом и, следовательно, предотвращая ошибку).

Рекомендации:

Array.prototype.indexOf().document.getElementsByClassName().Function.prototype.call().
 jpmottin07 апр. 2017 г., 11:51
Если вы хотите иметь дело сHTMLCollection и преобразовать его в массив JavaScript. посколькуES6, это можно сделать с помощью:var arr = Array.from ( yourHtmlCollection );  И тогда вы можете вызвать «indexOf» на немvar index = arr.indexOf( anElementOfThisArray );

getElementsByClassName не возвращает массив, ноHTMLCollection, Таким образом, он не имеет методов массива, таких какindexOf, Вам необходимо явно вызвать методы массива сthis значениеHTMLCollection как это:

var selected_id = Array.prototype.indexOf.call(arr, selected[0]);

Это потому чтоdocument.getElementsByClassName('class') не возвращаетArray, ноNodeList который является массивоподобным объектом. Вы можете превратить похожий на массив объект в массив, используя:

var elements = document.getElementsByClassName('class');
var arr = Array.prototype.slice.call(elements);

Ваш ответ на вопрос