J'ai un modèle qui est défini avec une réponse JSON à partir d'une base de données mysql. Les données de modèle sont définies avec true ou false dans un champ boolean/tinyint de la base de données, qui utilise 1
ou 0
.
À mon avis, j'ai une liaison qui recherche un booléen avec le caractère de soulignement _.isBoolean
. Bien sûr, lorsque mon modèle reçoit les données, elles sont définies avec 1
ou 0
au lieu de true ou false et la vérification _.isBoolean
échoue.
Existe-t-il un moyen pour que ma réponse JSON de mysql soit correctement une valeur booléenne true ou false au lieu de 1
ou 0
, ou de préférence, existe-t-il un moyen de permettre à mon modèle de se mettre à jour lors de l'extraction (et avant que la vue ne soit rendue) pour convertir true
ou false
en fonction de sa propriété 1 ou 0?
par exemple. les données de mon modèle ressemblent à {"isChecked":"1"}
quand j'en ai besoin {"isChecked":true}
Merci beaucoup pour toutes les suggestions que vous pourriez avoir!
Tout ce dont vous avez besoin est de convertir string
en int
avec +
et de convertir le résultat en booléen avec !!
:
var response = {"isChecked":"1"};
response.isChecked = !!+response.isChecked
Vous pouvez faire cette manipulation dans la méthode parse
:
parse : function (response) {
response.isChecked = !!+response.isChecked;
return response;
}
Utilisez un double pas:
!!1 = true;
!!0 = false;
obj.isChecked = !!parseInt(obj.isChecked);
Voici une autre option qui est plus longue mais peut être plus lisible:
Boolean(Number("0")); // false
Boolean(Number("1")); // true
Vous pouvez affecter la comparaison de la propriété à "1"
obj["isChecked"] = (obj["isChecked"]==="1");
Cela n'évalue que pour une valeur de chaîne de "1"
cependant. D’autres variables sont fausses comme un typeof number
serait faux. (i.e. obj["isChecked"]=1
)
Si vous voulez être inconsidéré à propos de "1"
ou 1
, vous pouvez utiliser:
obj["isChecked"] = (obj["isChecked"]=="1");
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
Même concept en PHP
$obj["isChecked"] = ($obj["isChecked"] == "1");
Les mêmes limitations d’opérateur que celles énoncées ci-dessus pour JavaScript s’appliquent.
Le «double non» fonctionne également. C'est déroutant quand les gens le lisent pour la première fois, mais cela fonctionne dans les deux langues pour les valeurs de type entier/nombre. Cependant, cela ne fonctionne pas en JavaScript pour les valeurs de type chaîne car elles sont toujours évaluées comme étant vraies:
!!"1"; //true
!!"0"; //true
!!1; //true
!!0; //false
!!parseInt("0",10); // false
echo !!"1"; //true
echo !!"0"; //false
echo !!1; //true
echo !!0; //false
Convertissez 1
'1'
et 'true'
en true
et 0
'0'
'false'
null
et undefined
en false
function primitiveToBoolean(value?: string | number | boolean | null): boolean {
if (value === 'true') {
return true;
}
return typeof value === 'string'
? !!+value // we parse string to integer first
: !!value;
}
Voici le test unitaire:
describe('primitiveToBoolean', () => {
it('should be true if its 1 / "1" or "true"', () => {
expect(primitiveToBoolean(1)).toBe(true);
expect(primitiveToBoolean('1')).toBe(true);
expect(primitiveToBoolean('true')).toBe(true);
});
it('should be false if its 0 / "0" or "false"', () => {
expect(primitiveToBoolean(0)).toBe(false);
expect(primitiveToBoolean('0')).toBe(false);
expect(primitiveToBoolean('false')).toBe(false);
});
it('should be false if its null or undefined', () => {
expect(primitiveToBoolean(null)).toBe(false);
expect(primitiveToBoolean(undefined)).toBe(false);
});
it('should pass through booleans - useful for undefined checks', () => {
expect(primitiveToBoolean(true)).toBe(true);
expect(primitiveToBoolean(false)).toBe(false);
});
});