在第一个结果处停止的 JavaScript 过滤器

Posted

技术标签:

【中文标题】在第一个结果处停止的 JavaScript 过滤器【英文标题】:JavaScript filter that stops at the first result 【发布时间】:2017-06-04 22:08:07 【问题描述】:

javascript 中是否有类似于filter 的机制(无需我自己编写)。但是,它不会返回集合的所有过滤元素,而是仅返回第一个元素。当然,我可以执行以下操作来获得第一个偶数:

[7,5,3,2,1].filter(x => x % 2 == 0)[0]

但是,如果该列表中还有 1000 万个数字,就会有很多不必要的工作。在像 Haskell 这样的语言中,由于惰性求值,其他 1000 万个数字不会被查看。

JavaScript 中是否有一种机制可以在第一个结果之后不评估任何元素来执行上述操作?

【问题讨论】:

【参考方案1】:

你可以试试.find:

[7,5,3,2,1].find(x => x % 2 == 0);
// result: 2

来自docs:

find() 方法返回数组中第一个元素的值 满足提供的测试功能。否则 undefined 是 返回。

简单的基准测试

var arr = [...Array(10000)].map( (item, idx) => idx )

arr.filter(i => i == 3000)[0]
arr.find(i => i == 3000)

/*
  arr.filter x 1,358 ops/sec ±0.40% (91 runs sampled)
  arr.find x 23,743 ops/sec ±0.40% (90 runs sampled)
  Fastest is arr.find
*/

【讨论】:

【参考方案2】:

我认为Array.prototype.find() 实现了这一点——它将检索数组中符合特定条件的第一个元素:

[7, 5, 3, 2, 1].find(isEvenNumber); //2

function isEvenNumber(elem) 
  return elem % 2 === 0;

【讨论】:

如果包含第二个偶数,您的示例将提供更多信息。

以上是关于在第一个结果处停止的 JavaScript 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 在第 n 个空格之间匹配数据并在第 n 个空格处停止

Grep 查找文件中的特定模式并在第一个匹配项处停止

如何在 javascript/jquery 中使用空元素在第三个索引处创建任何数组,例如 ['Aarav', 10, '', , '']

在最后一个元素处停止 Pathview 移动

如何使用javascript在asp.net上停止正在进行的回发(长时间运行)?

执行在 push_back 处停止