Reputation: 200
I am working on a basic calculator that takes input like this
" 100 + 10/2 + 3 + 0 "
and returns the output in a separate field.
when I break this thing into an array zero is not parsed as integer. My code is as following
var arr = ["100", "+", "0"];
arr = arr.map(x => parseInt(x) || x);
console.log(arr);
Upvotes: 6
Views: 10499
Reputation: 8336
Similar to other answers, zero is falsey. However, parseInt
returns NaN upon failure, and that can be used to build the answer as follows:
let arr = ["100", "+", "0"];
arr = arr.map((x) => {
const parsed = parseInt(x);
return Number.isNaN(parsed) ? x : parsed;
});
console.log(arr);
IMO this is a better solution as it is explicit about the return types that parseInt returns, and doesn't rely on type coercion.
Note: There are fun nuances with isNaN. The ES2015 Number.isNaN is used here to prevent any issues with type coercion, although it's not strictly necessary in this case.
Upvotes: 2
Reputation: 8239
parseInt("0")
is falsy. You can use Number()
to convert 0 to an integer.
Try the following:
var arr = ["100", "+", "0"];
arr = arr.map(x => !isNaN(Number(x))? Number(x) : x);
console.log(arr);
Upvotes: 1
Reputation: 171700
It's because 0
is falsy so after the parseInt("0")
returns falsy you end up getting the string
Try using isNaN()
instead
var arr = ["100", "+","0"];
arr = arr.map( x => isNaN(x) ? x : parseInt(x) );
// use F12 to see the console
console.log(arr); // output is being display as [100, "+","0"]
Upvotes: 6
Reputation: 23869
Zero is a falsy value, so short-circuiting won't work here. You need to check explicitly
var arr = ["100", "+","0"];
arr = arr.map( x => x == 0 ? 0 : (parseInt(x) || x));
console.log(arr);
Upvotes: 13