DOM方法document.querySelectorAll()
(以及其他一些方法)返回NodeList
。
要对列表进行操作,例如使用forEach()
时,必须先将NodeList
转换为Array
。
将NodeList
转换为Array
的最佳方式是什么?
答案 0 :(得分:54)
使用ES6,您可以使用Array.from(myNodeList)
。然后使用您最喜欢的数组方法。
var myNodeList = document.querySelectorAll('.my-selector');
// ALT 1
Array.from(myNodeList).forEach(function(el) {
console.log(el);
});
使用ES6 shim也可以在旧版浏览器中使用。
如果您使用的是转换器(例如Babel),还有两种选择:
var myNodeList = document.querySelectorAll('.my-selector');
// ALT 2
for (var el of myNodeList) {
el.classList.add('active'); // or some other action
}
// ALT 3
[...myNodeList].forEach((el) => {
console.log(el);
});
答案 1 :(得分:47)
您可以使用slice
原型中的Array
方法将其转换为数组:
var elList = document.querySelectorAll('.viewcount');
elList = Array.prototype.slice.call(elList, 0);
此外,如果您只需要forEach
,则可以从Array
原型中调用 ,而不是先将其强制转换为数组:
var elList = document.querySelectorAll('.viewcount');
Array.prototype.forEach.call(elList, function(el) {
console.log(el);
});
在ES6中,您可以使用新的Array.from
函数将其转换为数组:
Array.from(elList).forEach(function(el) {
console.log(el);
});
目前仅限于最前沿的浏览器,但如果您是using a polyfill service,则可以全面访问此功能。
如果您使用an ES6 transpiler,则甚至可以使用for..of
循环:
for (var element of document.querySelectorAll('.some .elements')) {
// use element here
}
答案 2 :(得分:47)
使用ES6,你可以做到:
const spanList = [...document.querySelectorAll("span")];
答案 3 :(得分:21)
为何转换? - 直接在元素集合上使用Array的call
函数;)
[].forEach.call( $('a'), function( v, i) {
// do something
});
假设 $ 是 querySelectorAll 的别名,当然
编辑:ES6允许更短的语法[...$('a')]
(仅适用于Firefox,截至2014年5月)
答案 4 :(得分:7)
是否必须forEach
?您只需使用for
循环迭代列表:
for (var i = 0; i < elementList.length; i++) {
doSomethingWith(elementlist.item(i));
}
答案 5 :(得分:6)
要在javascript中对列表进行操作,例如使用forEach(),NodeList必须转换为数组。
这不一定是真的。您可以将数组中的.forEach()添加到 NodeList ,它可以正常工作:
if ( ! NodeList.prototype.forEach ) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
您现在可以运行:
myNodeList.forEach(function(node){...})
像Arrays一样迭代NodeLists。
这比任何地方的.call()产生更短更简洁的代码。
答案 6 :(得分:2)
ES6允许像var nodeArray = Array.from(nodeList)
这样的酷炫方式,但我最喜欢的方式是新的传播操作符。
var nodeArray = Array(...nodeList);
答案 7 :(得分:1)
我使用以下内容是因为我认为这是最容易阅读的内容:
const elements = document.getElementsByClassName('element');
[...elements].forEach((element) => {
// code
});
答案 8 :(得分:1)
嗯,这也对我有用:
const elements = Object.values( document.querySelector(your selector here) )
Object.values()
返回给定对象的值的Array
。 NodeList
是对象,就像JS中的一切一样。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values
但是它与IE不兼容,所以我猜Array.prototype.*array_method*.call(yourNodeList)
是最好的选择。这样,您可以在NodeList
答案 9 :(得分:0)
这在ES6中与我合作
假设你有像这样的节点列表
<ul>
<li data-time="5:17">Flexbox video</li>
<li data-time="8:22">Flexbox video</li>
<li data-time="3:24">Redux video</li>
<li data-time="5:17">Flexbox video</li>
<li data-time="7:17">Flexbox video</li>
<li data-time="4:17">Flexbox video</li>
<li data-time="2:17">Redux video</li>
<li data-time="7:17">Flexbox video</li>
<li data-time="9:54">Flexbox video</li>
<li data-time="5:53">Flexbox video</li>
<li data-time="7:32">Flexbox video</li>
<li data-time="2:47">Redux video</li>
<li data-time="9:17">Flexbox video</li>
</ul>
const items = Array.from(document.querySelectorAll('[data-time]'));
console.log(items);
答案 10 :(得分:-1)
假设 elems 是nodeList:
var elems = document.querySelectorAll('select option:checked');
然后它可以变成一个数组,如下所示:
var values = [].map.call(elems, function(obj) {
return obj.value;
});