web-dev-qa-db-fra.com

Comment convertir 1 en true ou en false lors de l'extraction du modèle

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!

50
Chris M

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;
}
111

Utilisez un double pas:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
47
dave

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

Boolean(Number("0")); // false
Boolean(Number("1")); // true
23
bmaupin

Affectation de la comparaison à la valeur de la propriété

JavaScript

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");

Exemple 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 énoncées ci-dessus pour JavaScript s’appliquent.

Double pas

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:

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
6
SomeShinyObject

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);
  });
});

Recette TypeScript: Elegant Parse Boolean

0
Andrew