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?
Yes, the . filter() method returns a new array, without the filtered elements in the same order as initially. The order of the elements is one of the main feature of a array.
The filter() method creates a new array filled with elements that pass a test provided by a function. The filter() method does not execute the function for empty elements. The filter() method does not change the original array.
filter always returns an array (array of all the filtered items), use array. find to get the single object. please change your title, because you get an array as result of filter .
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 */
I think Array.prototype.find()
accomplishes this - it will retrieve the first element in an array that matches a certain criteria:
[7, 5, 3, 2, 1].find(isEvenNumber); //2 function isEvenNumber(elem) { return elem % 2 === 0; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With