So konvertieren Sie 1 in true oder 0 in false beim Modellabruf

97

Ich habe ein Modell, das mit einer JSON-Antwort aus einer MySQL-Datenbank festgelegt ist. Die Modelldaten werden mit true oder false in ein boolesches / tinyint-Feld in der Datenbank gesetzt, das 1oder verwendet 0.

Meiner Ansicht nach habe ich eine Bindung, die nach einem Booleschen Wert mit Unterstrichen sucht _.isBoolean. Wenn mein Modell die Daten empfängt, werden sie natürlich mit 1oder 0anstelle von wahr oder falsch gesetzt und die _.isBooleanPrüfung schlägt fehl.

Gibt es eine Möglichkeit, meine JSON-Antwort von mysql korrekt als booleschen Wert true oder false anstelle von 1oder 0vorzugsweise als Möglichkeit zu verwenden, mein Modell beim Abrufen (und vor dem Rendern der Ansicht) selbst zu aktualisieren, um es zu konvertieren trueoder darauf zu falsebasieren? Es ist 1 oder 0 Eigenschaft?

zB sehen die Daten meines Modells so aus, wie {"isChecked":"1"}ich es brauche{"isChecked":true}

Vielen Dank für Ihre Vorschläge!

Chris M.
quelle
Welche serverseitige Technologie wird verwendet?
Arun P Johny
PHP, die Antwort wird mit einem json_encode auf das Abfrageergebnis geschrieben
Chris M
Haben Sie es mit dem Weg versucht: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Antworten:

191

Alles was Sie brauchen ist konvertieren stringin intmit +und konvertieren Sie das Ergebnis in boolesche mit !!:

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

Sie können diese Manipulation in der folgenden parseMethode ausführen:

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

UPDATE : 7 Jahre später finde ich die Number(string)Konvertierung eleganter. Auch das Mutieren eines Objekts ist nicht die beste Idee. Davon abgesehen:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
quelle
18
+1 Zum Umwandeln in intzuerst. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Junge
76

Verwenden Sie ein doppeltes nicht:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
Dave
quelle
2
Dies funktionierte für mich, aber aus irgendeinem Grund hatte ich eine, die ich immer noch analysieren musstevalue = (!!parseInt(value) ? true : false)
Rick
Nur um sicher zu sein, !!2oder irgendeine andere Nummer = false, richtig?
Elijah Mock
Nein, !! 2 wäre wahr, es wird nur für 0
Dave
59

Hier ist eine weitere Option, die länger ist, aber möglicherweise besser lesbar ist:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
Bmaupin
quelle
6
Lesbarkeit FTW!
zero_cool
7
Im Jahr 2020 sollte dies die Antwort sein
etiennejcharles
13

Zuweisen eines Vergleichs zum Eigenschaftswert

JavaScript

Sie können den Vergleich der Eigenschaft zuweisen "1"

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

Dies wird nur für einen String-Wert von "1"obwohl ausgewertet . Andere Variablen, die wie eine tatsächliche typeof numberzu falsch ausgewertet werden, wären falsch. (dh obj["isChecked"]=1)

Wenn Sie wahllos über "1"oder sein möchten 1, können Sie Folgendes verwenden:

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

Beispielausgaben

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

Gleiches Konzept in PHP

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

Es gelten die gleichen Operatorbeschränkungen wie oben für JavaScript angegeben.

Verdoppeln Sie nicht

Das "Double Not" funktioniert auch. Es ist verwirrend, wenn Leute es zum ersten Mal lesen, aber es funktioniert in beiden Sprachen für Ganzzahl- / Zahlentypwerte. In JavaScript funktioniert dies jedoch nicht für Zeichenfolgentypwerte, da diese immer als wahr ausgewertet werden:

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
quelle
Gute Idee Christopher, ich konnte dies erreichen, indem ich schrieb: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` in der Initialisierungsfunktion von my Backbone-Ansicht.
Chris M