Comment convertir 1 en vrai ou 0 en faux lors de la récupération du modèle

99

J'ai un modèle qui est défini avec une réponse JSON d'une base de données mysql. Les données du modèle sont définies avec true ou false dans un champ booléen / tinyint de la base de données, qui utilise 1ou 0.

À mon avis, j'ai une liaison qui vérifie un booléen avec un trait de soulignement _.isBoolean. Bien sûr, lorsque mon modèle reçoit les données, il est défini avec 1ou 0au lieu de true ou false et la _.isBooleanvérification échoue.

Existe-t-il de toute façon soit correctement ma réponse JSON de mysql soit une valeur booléenne true ou false au lieu de 1ou 0, ou de préférence, existe-t-il un moyen de mettre à jour mon modèle lui-même lors de la récupération (et avant le rendu de la vue) pour le cast trueou falsebasé sur c'est 1 ou 0 propriété?

Par exemple, les données de mon modèle ressemblent à celles dont {"isChecked":"1"}j'ai besoin{"isChecked":true}

Merci beaucoup pour toutes les suggestions que vous pourriez avoir!

Chris M
la source
quelle est la technologie côté serveur utilisée?
Arun P Johny
PHP, la réponse est écrite avec un json_encode sur le résultat de la requête
Chris M
avez-vous essayé avec la manière: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Réponses:

193

Tout ce que vous avez besoin est converti stringà intavec +et convertir le résultat en booléens avec !!:

var response = {"isChecked":"1"};
response.isChecked = !!+response.isChecked

Vous pouvez faire cette manipulation dans la parseméthode:

parse: function (response) {
  response.isChecked = !!+response.isChecked;
  return response;
}

MISE À JOUR : 7 ans plus tard, je trouve la Number(string)conversion plus élégante. La mutation d'un objet n'est pas non plus la meilleure idée. Cela étant dit:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
la source
18
+1 Pour convertir en intpremier. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Young
76

Utilisez un double non:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
Dave
la source
2
Cela a fonctionné pour moi, mais pour une raison quelconque, j'avais un je devais encore analyservalue = (!!parseInt(value) ? true : false)
Rick
Juste pour être sûr, !!2ou tout autre numéro = false, non?
Elijah Mock
Non, !! 2 serait vrai, ce ne sera faux que pour 0
dave
61

Voici une autre option plus longue mais peut-être plus lisible:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
bmaupin
la source
6
Lisibilité FTW!
zero_cool
7
En 2020, ce devrait être l'asnwer
etiennejcharles le
13

Attribution d'une comparaison à la valeur de propriété

JavaScript

Vous pouvez attribuer la comparaison de la propriété à "1"

obj["isChecked"] = (obj["isChecked"]==="1");

Cela évalue uniquement pour une valeur String de "1"cependant. D'autres variables évaluent à faux comme un réel typeof numberserait faux. (ie obj["isChecked"]=1)

Si vous voulez être indiscret sur "1"ou 1, vous pouvez utiliser:

obj["isChecked"] = (obj["isChecked"]=="1");

Exemples de sorties

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

Même concept en PHP

$obj["isChecked"] = ($obj["isChecked"] == "1");

Les mêmes limitations d'opérateur que celles indiquées ci-dessus pour JavaScript s'appliquent.

Double pas

Le «double pas» fonctionne également. C'est déroutant lorsque 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 évaluent toujours à 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
SomeShinyObject
la source
bonne idée Christopher, j'ai pu y parvenir en écrivant: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` dans la fonction initialize de mon vue de l'épine dorsale.
Chris M