I'm trying to filter all non-numeric elements out from an array. We can see the desired output when using typeof. But with Number, it filters zero out.
Here's the example (tested in Chrome Console):
[-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number) // Which output with zero filtered out: [-1, 1, 2, 3, 4] // 0 is filtered
If we use typeof, it doesn't filter zero, which was expected.
// code [-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(n => typeof n === 'number') // output [-1, 0, 1, 2, 3, 4, 0]
My question:
What is the difference between the 'Number' and 'typeof' approaches?
Number filters zero, but 'Number' itself literally contains zero, and this confuses me.
JavaScript Array filter()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.
To answer the question of filter and map, filter returns only those elements if the return value in the function is true. Map returns same number of elements, for the return of false value, the element returned would be undefined. One more thing, the map return a new array. Filter does not return a new array.
Use the filter() method to filter an array to only numbers, e.g. arr. filter(value => typeof value === 'number') . The filter method returns an array with all the elements that satisfy the condition. In our case, all array elements with a type of number .
The JavaScript filter array function is used to filter an array based on specified criteria. After filtering it returns an array with the values that pass the filter. The JavaScript filter function iterates over the existing values in an array and returns the values that pass.
Because 0
is one of the many falsy
values in javascript
All these conditions will be sent to else
blocks:
if (false) if (null) if (undefined) if (0) if (NaN) if ('') if ("") if (``)
From the Array.prototype.filter()
documentation:
filter()
calls a providedcallback
function once for each element in an array, and constructs a new array of all the values for which callback returns a value that coerces to true
In your case the callback function is the Number
. So your code is equivalent to:
[-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(a => Number(a)) // Number(0) -> 0 // Number(Number(0)) -> 0 // Number('') -> 0 // Number('test') -> NaN
When filter
function picks truthy values (or values that coerces to true
), the items which return 0
and NaN
are ignored. So, it returns [-1, 1, 2, 3, 4]
To prevent a falsy zero from filtering, you could use another callback for getting only numerical values: Number.isFinite
console.log([-1, 0, 1, 2, 3, 4, Number(0), '', 'test'].filter(Number.isFinite))
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