将JavaScript NodeList转换为Array的最快方法?

时间:2010-07-07 23:04:50

标签: javascript arrays nodelist

以前在这里回答的问题说这是最快的方法:

//nl is a NodeList
var arr = Array.prototype.slice.call(nl);

在我的浏览器基准测试中,我发现它比这慢3倍:

var arr = [];
for(var i = 0, n; n = nl[i]; ++i) arr.push(n);

它们都产生相同的输出,但我发现很难相信我的第二个版本是最快的方式,特别是因为人们在这里另有说法。

这是我浏览器中的怪癖(Chromium 6)吗?或者有更快的方法吗?

编辑:对于任何关心的人,我选择了以下内容(这似乎是我测试的每个浏览器中最快的):

//nl is a NodeList
var l = []; // Will hold the array of Node's
for(var i = 0, ll = nl.length; i != ll; l.push(nl[i++]));

EDIT2:我找到了更快的方式

// nl is the nodelist
var arr = [];
for(var i = nl.length; i--; arr.unshift(nl[i]));

14 个答案:

答案 0 :(得分:193)

使用ES6,我们现在有一种从NodeList创建数组的简单方法:Array.from()函数。

// nl is a NodeList
let myArray = Array.from(nl)

答案 1 :(得分:187)

第二个在某些浏览器中往往更快,但主要的一点是你必须使用它,因为第一个不是跨浏览器。即使是“泰晤士报”他们也是一名长老的人。

@kangax IE 9预览

  

Array.prototype.slice 现在可以转换了   某些主机对象(例如NodeList)   到数组 - 大多数的东西   现代浏览器已经能够做到   很长一段时间。

示例:

Array.prototype.slice.call(document.childNodes);

答案 2 :(得分:93)

使用ES6 spread operator

,这是一种新的酷炫方式
let arr = [...nl];

答案 3 :(得分:19)

一些优化:

  • 将NodeList的长度保存在变量
  • 在设置之前显式设置新数组的长度。
  • 访问指数,而不是推或不推。

代码(jsPerf):

var arr = [];
for (var i = 0, ref = arr.length = nl.length; i < ref; i++) {
 arr[i] = nl[i];
}

答案 4 :(得分:15)

结果将完全取决于浏览器,做出客观判断,我们必须进行一些性能测试,这里有一些结果,你可以运行它们here

Chrome 6:

Firefox 3.6:

Firefox 4.0b2:

Safari 5:

IE9平台预览版3:

答案 5 :(得分:14)

最快且交叉的浏览器是

for(var i=-1,l=nl.length;++i!==l;arr[i]=nl[i]);

我在

进行比较

http://jsbin.com/oqeda/98/edit

*感谢@CMS的想法!

Chromium (Similar to Google Chrome) Firefox Opera

答案 6 :(得分:7)

NodeList.prototype.forEach = Array.prototype.forEach;

现在你可以做document.querySelectorAll('div')。forEach(function()...)

答案 7 :(得分:5)

更快更短:

// nl is the nodelist
var a=[], l=nl.length>>>0;
for( ; l--; a[l]=nl[l] );

答案 8 :(得分:3)

查看此博客文章here,其中涉及相同的内容。从我收集的内容来看,额外的时间可能与走在范围链上有关。

答案 9 :(得分:3)

这是我在JS中使用的函数:

function toArray(nl) {
    for(var a=[], l=nl.length; l--; a[l]=nl[l]);
    return a;
}

答案 10 :(得分:3)

在ES6中,您可以使用:

  • Array.from

    let array = Array.from(nodelist)

  • 扩展运算符

    let array = [...nodelist]

答案 11 :(得分:1)

以下是截至本发布日期更新的图表(“未知平台”图表为Internet Explorer 11.15.16299.0):

Safari 11.1.2 Firefox 61.0 Chrome 68.0.3440.75 Internet Explorer 11.15.16299.0

从这些结果来看,预分配1方法似乎是最安全的跨浏览器投注。

答案 12 :(得分:0)

假设var renderer = this.GetComponent<Renderer>(); ,这是将var material = GetComponent<Renderer>().material; originalColor = material.color; 转换为数组的一种简洁形式。

nodeList = document.querySelectorAll("div")

见我用它How does Keras evaluate the accuracy?

答案 13 :(得分:-2)

就去做吧 vat arr = [...nodeList]