I have a JavaScript array :
const arr = ['a', 'b', 1, 4, 6, 'John', 9, 91];
I want to only keep the integers and filter out the strings and characters. Is there any way to do it ? I tried with typeof() but it is not working. Thanks in advance.
You can use Array.prototype.filter and filter out the items which are numbers using the typeof operator.
const
arr = ["a", "b", "1", 4, 6, "John", 9, 91],
nums = arr.filter((a) => typeof a === "number");
console.log(nums);
Another approach
You can also do it coercing the items to a number. The strings which cannot be coerced to a number result in NaN, a falsy value in JS, and hence are filtered out.
const
arr = ["a", "b", 1, 4, 6, "John", 9, 91],
nums = arr.filter(Number);
console.log(nums);
But note strings that can be coerced to numbers like "1", "123" etc will not get filtered out by the second approach.
And more importantly this approach would filter out all zeroes (0, "0") in the array as 0 is a falsy value in JS.
const
arr = ["1", "4", "6", 0, "0"],
nums = arr.filter(Number);
console.log(nums);
Filtering Integers
You can also filter only integers using Number.isInteger
const
arr = ["1", 2, -3, 4.5],
ints = arr.filter(Number.isInteger);
console.log(ints);
But note, this approach would not filter out numbers where the integral part of the number is equal to the number itself. In other words simply appending zeroes after the decimal point (like 1.00000) would not yield false when passed to isInteger.
const
arr = [1.0, 2.01],
ints = arr.filter(Number.isInteger);
console.log(ints);
Number filters out the legitimate number 03.0000000000000001 simply is parsed to the floating point number 3, since there is not enough precision to represent such a small fraction. This has nothing to do with Number.isInteger.true with isInteger. For ex: (1) 1.0 can be represented as an integer, so Number.isInteger(1.0) gives true. (2) Number 2.1 cannot be represented as an integer and there's enough precision as well, so Number.isInteger(2.1) gives false. (3) Lastly 3.0000000000000001 because of lack of precision becomes an Integer, hence Number.isInteger(3.0000000000000001) gives true.Number.isInteger. The 3.000…01 becomes an integer (in floating point representation) at parsing, it already is an integer when being passed to the function const arr = ['a', 'b', 1, 4, 6, 'John', 9, 91];
const number = arr.filter(item => typeof item === 'number')
console.log(number )
here the correct way
You can also iterate over array values using for loop and check whether the number in condition and push in new array which will result in getting all the number values.
const arr = ['a', 'b', 1, 4, 6, 'John', 9, 91];
newArr=[];
for(let i=0;i<arr.length;i++){
/* console.log(arr[i]); */
if(Number(arr[i])){
newArr.push(arr[i]);
}
}
console.log(newArr);
typeof. Can you show your code so we can see why it's not working?const arr = ['a', 'b', 1, 4, 6, 'John', 9, 91]; console.log(arr.filter((x) => { if(typeof x === Number) { return x; } }))typeofis a function? It is not. It is a keyword likereturnorelse. See: jsfiddle.net/pf1x0sw7arr.filter(Number);return [1, 4, 6, 9, 91]. Doesn't make a solution.