在ES6中筛选或映射节点列表的最有效方法是什么?
根据我的阅读,我将使用以下选项之一:
[...nodelist].filter
要么
Array.from(nodelist).filter
您会推荐哪一个?是否有更好的方法,例如不涉及数组?
在ES6中筛选或映射节点列表的最有效方法是什么?
根据我的阅读,我将使用以下选项之一:
[...nodelist].filter
要么
Array.from(nodelist).filter
您会推荐哪一个?是否有更好的方法,例如不涉及数组?
...
较早的IDE可能不支持语法,而Array.from()
这只是常规方法。
Answers:
[...nodelist]
如果对象是可迭代的,则将由对象组成数组。Array.from(nodelist)
如果对象是可迭代的,或者对象是类似数组的对象(具有.length
数字道具),则将从对象中组成一个数组如果NodeList.prototype[Symbol.iterator]
存在,您的两个示例将是相同的,因为这两种情况都涉及可迭代。如果您的环境尚未配置NodeList
为可迭代,则第一个示例将失败,第二个示例将成功。Babel
目前无法正确处理这种情况。
所以如果你 NodeList
是可迭代的,则取决于您所使用的。我可能会视情况选择。这样做的一个好处Array.from
是,它需要一个映射函数的第二个参数,而第一个[...iterable].map(item => item)
则必须创建一个临时数组,Array.from(iterable, item => item)
而不必。但是,如果您不映射列表,则没关系。
TL; DR;
Array.prototype.slice.call(nodelist).filter
slice()方法返回一个数组。返回的数组是集合(NodeList)的浅表副本,
因此它比Array.from()更快地
工作,因此它与Array.from()一样快。
原始集合的元素被复制到返回的数组中,如下所示:
关于论点的简短解释
Array.prototype.slice(beginIndex,endIndex)
Array.prototype.slice.call(命名空间,beginIndex,endIndex)
Array.from
。是时候找到IE机器了。现在我真的很困惑,因为我能够在IE10和IE11中使用Array.from:\。此方法在IE10 + 11中确实有效,但是当所有文档都另有说明时,Array.from无法使我轻松工作。
Array.from
在IE11中对我不起作用对象不支持属性或方法“ from”
Array.from
还返回浅表副本。因此,我看不出您如何得出结论说它的运行速度比快Array#slice
。
这个怎么样:
// Be evil. Extend the prototype.
if (window.NodeList && !NodeList.prototype.filter) {
NodeList.prototype.filter = Array.prototype.filter;
}
// Use it like you'd expect:
const noClasses = document
.querySelectorAll('div')
.filter(div => div.classList.length === 0)
这与MDN文档中针对NodeList.forEach(在“ Polyfill”下)提到的方法相同,适用于IE11,Edge,Chrome和FF。
babel
,然后[...coll]
只需调用非Array.from(coll)
的任何内容即可Array
。