【问题标题】:Difference between find() and filter().shift() on javascriptjavascript 上 find() 和 filter().shift() 的区别
【发布时间】:2016-02-18 22:51:04
【问题描述】:

我最近开始在我的(一些)项目上放弃下划线/lodash 过度使用,并意识到浏览器中没有完全支持 find 方法。 ES6 方法 find 和使用 .shift() over filter 结果有什么区别

var user = users.find(function() { ... } );

var user = users.filter(function() { ... } ).shift();

我想对“find”方法有明显的优化(在第一次匹配时停止迭代),但是使用第二种方法可以得到意想不到的结果吗?我应该改用polyfill 吗?为什么?

【问题讨论】:

  • 什么意外结果?
  • shift 函数删除数组的第一个元素并返回它。 filter 函数创建一个新数组。我不明白为什么这可能是个问题。有人吗?

标签: javascript ecmascript-6


【解决方案1】:

除了明显(且引人注目)的开销之外,是的,结果可能会有所不同。 filter 一直运行到数组的末尾,并在每个项目上调用其回调;与find 不同,后者在找到一个后停止。当回调在这些额外迭代的元素之一上引发异常时,结果会有所不同。
我看不出有什么理由不使用find

【讨论】:

  • IE 不支持“查找”。
  • @hanesjw 这不是不使用find的理由,只是安装polyfill的理由
  • 这就是不使用IE的原因。
  • 还要注意 filter 返回一个 array ,而 find 返回一个 object
  • @ambianBeing "直到找到callback 返回true的位置"。或者数组的末尾,当它没有找到这样的项目时。
【解决方案2】:

使用polyfillusers.filter(function() { ... } ).shift(); 在触发不必要的垃圾收集的同时丢弃循环。

  • filter 扫描整个数组并创建另一个数组
  • shift 现在必须更改临时数组上的所有索引

使用users.filter(function() { ... } )[0] 是一种稍微不那么浪费的模式

【讨论】:

  • 如果数组可以是空的,稍微少一点浪费的模式会很痛苦。
  • @JackBlack 你应该更具描述性。怎么会痛?如果上例中users 为空,则会得到undefined,这样看起来OK?
  • 如果没有元素,则无法通过 [0] 访问数组中的第一项,即数组为空。
  • @JackBlack 这没有意义,是的,你得到未定义,但没有错误。这意味着您的过滤器没有返回任何结果,并且是一个很好的结果。
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 2015-08-24
  • 1970-01-01
  • 2011-01-08
  • 2011-11-25
  • 2015-10-03
  • 2018-06-22
  • 2017-03-19
相关资源
最近更新 更多