数组中的IndexOf元素

IndexOf element in array

本文关键字:元素 IndexOf 数组      更新时间:2023-09-26

我试图从元素数组中获取索引。

 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()和搜索,但出现了相同的错误。

这是因为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对象不可用的方式进行调用(以合法的方式调用它,从而防止错误)。

参考文献:

  • CCD_ 11
  • document.getElementsByClassName()
  • Function.prototype.call()

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);