Ich habe ein Modell, das eine JSON-Antwort aus einer MySQL-Datenbank enthält. Die Modelldaten werden mit "true" oder "false" in ein boolesches/tinyint-Feld in der Datenbank gesetzt, das 1
oder 0
verwendet.
Aus meiner Sicht habe ich eine Bindung, die nach einem Boolean mit _.isBoolean
des Unterstrichs sucht. Wenn mein Modell die Daten erhält, wird es natürlich mit 1
oder 0
anstelle von true oder false festgelegt, und die _.isBoolean
-Prüfung schlägt fehl.
Gibt es sowieso entweder entweder meine JSON-Antwort von mysql korrekt zu sein, sondern einen booleschen true- oder false-Wert anstelle von 1
oder 0
, oder vorzugsweise gibt es eine Möglichkeit, mein Modell beim Abrufen (und bevor die Ansicht rendert) aktualisieren zu lassen, um true
zu konvertieren. oder false
basierend auf der Eigenschaft 1 oder 0?
z.B. Die Daten meines Modells sehen wie {"isChecked":"1"}
aus, wenn ich {"isChecked":true}
brauche.
Vielen Dank für Ihre Anregungen!
Sie brauchen nur string
in int
mit +
konvertieren und das Ergebnis mit !!
in boolean konvertieren
var response = {"isChecked":"1"};
response.isChecked = !!+response.isChecked
Sie können diese Bearbeitung in der parse
-Methode vornehmen:
parse : function (response) {
response.isChecked = !!+response.isChecked;
return response;
}
Verwenden Sie ein doppeltes nicht:
!!1 = true;
!!0 = false;
obj.isChecked = !!parseInt(obj.isChecked);
Hier ist eine weitere Option, die länger ist, aber lesbarer sein kann:
Boolean(Number("0")); // false
Boolean(Number("1")); // true
Sie können den Vergleich der Eigenschaft "1"
zuweisen.
obj["isChecked"] = (obj["isChecked"]==="1");
Dies wird jedoch nur für einen String-Wert von "1"
ausgewertet. Andere Variablen werden auf false gesetzt, wie ein tatsächlicher typeof number
wäre false. (d. h. obj["isChecked"]=1
)
Wenn Sie über "1"
oder 1
unauffällig sein möchten, können Sie Folgendes verwenden:
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
Gleiches Konzept in PHP
$obj["isChecked"] = ($obj["isChecked"] == "1");
Es gelten die gleichen Operator-Einschränkungen wie oben für JavaScript angegeben.
Das 'double not' funktioniert auch. Es ist verwirrend, wenn die Leute es zum ersten Mal lesen, aber es funktioniert in beiden Sprachen für Ganzzahl-/Zahlentypwerte. Es funktioniert jedoch nicht in JavaScript für Zeichenfolgentypwerte, da sie immer als wahr ausgewertet werden:
!!"1"; //true
!!"0"; //true
!!1; //true
!!0; //false
!!parseInt("0",10); // false
echo !!"1"; //true
echo !!"0"; //false
echo !!1; //true
echo !!0; //false
Konvertieren Sie 1
'1'
und 'true'
in true
und 0
'0'
'false'
null
und undefined
in 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;
}
Hier ist Unit-Test:
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);
});
});