javascript上find()和filter().shift()之间的区别

nei*_*ker 53 javascript ecmascript-6

我最近开始放弃下划线/ lodash过度使用(部分)我的项目并意识到浏览器中没有完全支持find方法.ES6方法查找和使用.shift()与过滤器结果之间的区别是什么

var user = users.find(function() { ... } );
Run Code Online (Sandbox Code Playgroud)

要么

var user = users.filter(function() { ... } ).shift();
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 102

除了明显(和明显)的开销之外,是的,结果可能会有所不同.filter运行到数组的末尾,并在每个项目上调用它的回调; 相比之下find,找到一个后停止.当回调在这些另外迭代的元素之一上抛出异常时,结果是不同的.
我认为没有任何理由不使用find.

  • 这是不使用IE的原因. (57认同)
  • @hanesjw没有理由不使用`find`,只是安装[polyfill]的原因(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#填充工具) (21认同)
  • 还要注意,filter会返回一个array,而find会返回一个object。 (13认同)
  • IE不支持'find'. (8认同)

Jua*_*des 19

使用polyfill ; users.filter(function() { ... } ).shift();在触发不必要的垃圾收集时抛弃周期.

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

将使用稍微浪费的模式 users.filter(function() { ... } )[0]

  • @JackBlack你应该更具描述性。怎么会痛呢?如果上面的例子中“users”为空,你会得到“undefined”,这看起来没问题吗? (3认同)