I have a model that is set with a JSON response from a mysql database. The model data is set with true or false into a boolean/tinyint field in the database, which uses 1
or 0
.
In my view, I have a binding that checks for a boolean with underscore's _.isBoolean
. Of course, when my model receives the data, it is set with 1
or 0
instead of true or false and the _.isBoolean
check fails.
Is there anyway to either correctly have my JSON response from mysql be a boolean true or false value instead of 1
or 0
, or preferably, is there a way to have my model update itself upon fetch (and before the view renders) to cast true
or false
based on it's 1 or 0 property?
e.g. my model's data looks like {"isChecked":"1"}
when I need it to be {"isChecked":true}
Thank you greatly for any suggestions you may have!
All you need is convert string
to int
with +
and convert the result to boolean with !!
:
var response = {"isChecked":"1"};
response.isChecked = !!+response.isChecked
You can do this manipulation in the parse
method:
parse: function (response) {
response.isChecked = !!+response.isChecked;
return response;
}
UPDATE: 7 years later, I find Number(string)
conversion more elegant. Also mutating an object is not the best idea. That being said:
parse: function (response) {
return Object.assign({}, response, {
isChecked: !!Number(response.isChecked), // OR
isChecked: Boolean(Number(response.isChecked))
});
}
Use a double not:
!!1 = true;
!!0 = false;
obj.isChecked = !!parseInt(obj.isChecked);
value = (!!parseInt(value) ? true : false)
!!2
or any other number = false
, right?
Here's another option that's longer but may be more readable:
Boolean(Number("0")); // false
Boolean(Number("1")); // true
Assigning Comparison to property value
JavaScript
You could assign the comparison of the property to "1"
obj["isChecked"] = (obj["isChecked"]==="1");
This only evaluates for a String value of "1"
though. Other variables evaulate to false like an actual typeof number
would be false. (i.e. obj["isChecked"]=1
)
If you wanted to be indiscrimate about "1"
or 1
, you could use:
obj["isChecked"] = (obj["isChecked"]=="1");
Example Outputs
console.log(obj["isChecked"]==="1"); // true
console.log(obj["isChecked"]===1); // false
console.log(obj["isChecked"]==1); // true
console.log(obj["isChecked"]==="0"); // false
console.log(obj["isChecked"]==="Elephant"); // false
PHP
Same concept in PHP
$obj["isChecked"] = ($obj["isChecked"] == "1");
The same operator limitations as stated above for JavaScript apply.
Double Not
The 'double not' also works. It's confusing when people first read it but it works in both languages for integer/number type values. It however does not work in JavaScript for string type values as they always evaluate to true:
JavaScript
!!"1"; //true
!!"0"; //true
!!1; //true
!!0; //false
!!parseInt("0",10); // false
PHP
echo !!"1"; //true
echo !!"0"; //false
echo !!1; //true
echo !!0; //false
Boolean(Number(myVar))
or
!!+myVar
Success story sharing
int
first.!!+"1"; // true
,!!+"0"; // false
,!!+1; // true
,!!+0; // false