Jak przekonwertować 1 na prawdę lub 0 na fałsz po pobraniu modelu

103

Mam model, który jest ustawiony z odpowiedzią JSON z bazy danych mysql. Dane modelu są ustawiane z wartością true lub false w polu boolean / tinyint w bazie danych, które używa 1lub 0.

Moim zdaniem mam powiązanie, które sprawdza wartość logiczną z podkreśleniem _.isBoolean. Oczywiście, kiedy mój model otrzymuje dane, jest ustawiany z 1lub 0zamiast true lub false, a _.isBooleansprawdzenie kończy się niepowodzeniem.

Czy istnieje sposób, aby moja odpowiedź JSON z mysql była poprawnie logiczną wartością true lub false zamiast 1lub 0, lub najlepiej, czy istnieje sposób, aby mój model zaktualizował się po pobraniu (i przed renderowaniem widoku) do rzutowania truelub falsena podstawie to jest nieruchomość 1 czy 0?

np. dane mojego modelu wyglądają tak, jak {"isChecked":"1"}tego potrzebuję{"isChecked":true}

Bardzo dziękuję za wszelkie sugestie!

Chris M.
źródło
jaka jest używana technologia po stronie serwera?
Arun P Johny
PHP, odpowiedź jest zapisywana z kodem json_encode w wyniku zapytania
Chris M
czy próbowałeś na drodze: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Odpowiedzi:

198

Wszystko, czego potrzebujesz, to przekonwertować stringna intz +i przekonwertować wynik na wartość logiczną za pomocą !!:

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

Możesz wykonać tę manipulację w parsemetodzie:

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

AKTUALIZACJA : 7 lat później Number(string)konwersja wydaje mi się bardziej elegancka. Mutowanie obiektu również nie jest najlepszym pomysłem. Biorąc to pod uwagę:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
źródło
18
+1 za konwersję na intpierwszy. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Młody
79

Użyj podwójnego nie:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
dave
źródło
2
To działało dla mnie, ale z jakiegoś powodu musiałem to przeanalizowaćvalue = (!!parseInt(value) ? true : false)
Rick
Dla pewności, !!2czy jakakolwiek inna liczba = false, prawda?
Elijah Mock
Nie, !! 2 byłoby prawdą, będzie fałszywe tylko dla 0
dave
63

Oto kolejna opcja, która jest dłuższa, ale może być bardziej czytelna:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
bmaupin
źródło
7
Czytelność FTW!
zero_cool
9
W 2020 roku powinno to być powiadomienie
etiennejcharles
14

Przypisywanie porównania do wartości właściwości

JavaScript

Możesz przypisać porównanie właściwości do "1"

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

Oblicza się to tylko dla wartości String równej "1". Inne zmienne oceniają jako fałszywe, tak jak rzeczywiste typeof numberbyłyby fałszywe. (tj. obj["isChecked"]=1)

Jeśli chcesz być nieokreślony "1"lub 1możesz użyć:

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

Przykładowe wyniki

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

Ta sama koncepcja w PHP

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

Mają zastosowanie te same ograniczenia dotyczące operatora, jak podano powyżej dla JavaScript.

Podwójnie nie

Funkcja „podwójne nie” również działa. Jest to mylące, gdy ludzie czytają go po raz pierwszy, ale działa w obu językach dla wartości typu integer / number. Jednak nie działa w JavaScript dla wartości typu string, ponieważ zawsze są one oceniane jako prawda:

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
źródło
dobry pomysł Christopherze, udało mi się to osiągnąć pisząc: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` w funkcji inicjalizacji mojego widok kręgosłupa.
Chris M