在 JavaScript 中,将 NodeList 转换为数组的最佳方法是什么?
DOM 方法 document.querySelectorAll()
(以及其他一些方法)返回一个 NodeList
。
要对列表进行操作(例如使用forEach()
),NodeList
必须首先转换为Array
。
将 NodeList
转换为 Array
的最佳方法是什么?
The DOM method document.querySelectorAll()
(and a few others) return a NodeList
.
To operate on the list, e.g. using forEach()
, the NodeList
must first be converted to an Array
.
What's the best way to convert the NodeList
to an Array
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
使用 ES6,你可以简单地执行以下操作:
With ES6 you can simply do:
在 ES6 中,您可以使用 Array.from(myNodeList)。然后使用您最喜欢的数组方法。
使用 ES6 shim 也可以在旧版浏览器中使用此功能。
如果如果您正在使用转译器(例如 Babel),还有两种选择:
With ES6 you can use
Array.from(myNodeList)
. Then use your favourite array method.Use an ES6 shim to make this work in older browsers too.
If you are using a transpiler (for example Babel) there are two more alternatives:
您可以使用
Array
原型中的slice
方法将其转换为数组:此外,如果您需要的只是
forEach
,您可以调用 来自Array
原型,无需先将其强制转换为数组:在 ES6 中,您可以使用新的
Array.from
函数将其转换到数组:目前仅在前沿浏览器中存在,但如果当您使用polyfill服务时,您将可以全面访问此功能。
如果您使用ES6转译器,您甚至可以使用
for..of
循环代替:You can convert it to an array by using the
slice
method from theArray
prototype:Furthermore, if all you need is
forEach
, you can invoke that from theArray
prototype, without coercing it to an array first:In ES6, you can use the new
Array.from
function to convert it to an array:This is currently only in bleeding edge browsers, but if you're using a polyfill service you will have access to this function across the board.
If you're using an ES6 transpiler, you can even use a
for..of
loop instead:为什么要转换? - 只需直接在元素集合上
调用
Array 函数即可;)假设$ 当然是querySelectorAll 的别名
编辑:ES6 允许更短的语法
[...$('a')]
(仅适用于 Firefox,截至 2014 年 5 月)Why convert? - just
call
function of Array directly on element collection ;)assuming $ is your alias for querySelectorAll, of course
edit: ES6 allows for even shorter syntax
[...$('a')]
(works in Firefox only, as of May 2014)2020 更新:nodeList.forEach() 现已成为官方标准 并在所有当前浏览器中受支持。
较旧的浏览器可以使用下面的polyfill。
那不是真的。
.forEach()
适用于当前浏览器。如果它丢失,您可以使用polyfill将.forEach()从Array添加到NodeList并且它工作正常:您现在可以运行:
像数组一样迭代NodeLists 。
这会产生比 .call() 更短、更干净的代码。
2020 update: nodeList.forEach() is now an official standard and supported in all current browsers.
Older browsers can use the polyfill below.
That's not true.
.forEach()
works in current browsers. If it's missing, you can use a polyfill to add .forEach() from Array to NodeList and it works fine:You can now run:
To iterate over NodeLists just like Arrays.
This produces much shorter and cleaner code than .call() everywhere.
它必须是
forEach
吗?您可以简单地使用for
循环来迭代列表:Does it have to be
forEach
? You could simply use afor
loop to iterate over the list:好吧,这也适用于我:
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
上的任何数组方法Well, this works for me too:
Object.values()
returnsArray
of values of given object.NodeList
is object, as is everything in JS.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values
But it's not compatible with IE, so i guess
Array.prototype.*array_method*.call(yourNodeList)
is the best option. With this you can invoke any array method on yourNodeList
假设elems是一个nodeList:
那么它可以变成一个数组,如下所示:
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example:_using_map_generically_querySelectorAll
Assuming elems is a nodeList:
then it can be turned into an array as follows:
Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example:_using_map_generically_querySelectorAll
这在 ES6 中对我有用,
假设你有这样的节点列表
That worked with me in ES6
lets assume you have nodelist like that
我使用以下内容是因为我认为它最容易阅读:
I use the following because I think it's easiest to read:
ES6 允许使用像 var nodeArray = Array.from(nodeList) 这样很酷的方法,但我最喜欢的是新的展开运算符。
ES6 allows cool ways like
var nodeArray = Array.from(nodeList)
but my favorite one is the new spread operator.打字稿版本:
TypeScript version: