在 ES6 中筛选或映射节点列表

在ES6中过滤或映射节点列表的最有效方法是什么?

根据我的读数,我将使用以下选项之一:

[...nodelist].filter

Array.from(nodelist).filter

你会推荐哪一个?有没有更好的方法,例如不涉及数组?


答案 1
  • [...nodelist]如果对象是可迭代的,则将创建一个对象的数组。
  • Array.from(nodelist)如果对象是可迭代的,或者如果对象是类似数组的(具有和数字道具),则将从对象中生成数组.length

如果存在,则两个示例将完全相同,因为这两个示例都涵盖可迭代。但是,如果您的环境尚未配置为可迭代,则第一个示例将失败,第二个示例将成功。 目前无法正确处理此情况NodeList.prototype[Symbol.iterator]NodeListBabel

因此,如果您的可迭代,那么使用哪种方法实际上取决于您。我可能会根据具体情况进行选择。它的一个好处是,它采用映射函数的第二个参数,而第一个参数必须创建一个临时数组,则不会。但是,如果您没有映射列表,则无关紧要。NodeListArray.from[...iterable].map(item => item)Array.from(iterable, item => item)


答案 2

TL;DR;

Array.prototype.slice.call(nodelist).filter

slice() 方法返回一个数组。返回的数组是集合的浅副本(NodeList),因此它比Array.from()工作得更快,因此它的工作速度与Array.from()一样快。

原始集合的元素将复制到返回的数组中,如下所示:

  • 对于对象引用(而不是实际对象),slice 将对象引用复制到新数组中。原始数组和新数组都引用同一对象。如果引用的对象发生更改,则这些更改对新数组和原始数组都可见。
  • 对于字符串、数字和布尔值(不是字符串、数字和布尔对象),slice 会将这些值复制到新数组中。对一个数组中的字符串、数字或布尔值的更改不会影响另一个数组。

关于论点的简短解释

Array.prototype.slice(beginIndex, endIndex)

  • 采用可选的 args beginIndex 和 endIndex。如果未提供切片,则使用 beginIndex == 0,因此它会从集合中提取所有项

Array.prototype.slice.call(namespace, beginIndex, endIndex)

  • 将对象作为第一个参数。如果我们使用一个集合作为对象,它字面上意味着我们直接从该对象命名空间调用slice方法。