Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

arrays - JavaScript filter that stops at the first result

Is there a mechanism in JavaScript (without having to write my own) similar to filter. Instead of returning all the filtered elements of a collection though, it only returns the first one. Of course I could do the following to get the first even number:

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

But if there were 10 million more numbers in that list, there'd be a lot of unnecessary work. In a language like Haskell, the other 10 million numbers wouldn't be looked at due to lazy evaluation.

Is there a mechanism in JavaScript to do the above without evaluating any elements after the first result?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can try .find:

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

From the docs:

The find() method returns a value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned.

Simple benchmark

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
*/

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...