Cómo convertir 1 a verdadero o 0 a falso al recuperar el modelo

99

Tengo un modelo que está configurado con una respuesta JSON de una base de datos mysql. Los datos del modelo se establecen con verdadero o falso en un campo booleano / tinyint en la base de datos, que usa 1o 0.

En mi opinión, tengo un enlace que busca un booleano con subrayado _.isBoolean. Por supuesto, cuando mi modelo recibe los datos, se establece con 1o en 0lugar de verdadero o falso y la _.isBooleanverificación falla.

¿Hay alguna forma de que mi respuesta JSON de mysql sea correctamente un valor booleano verdadero o falso en lugar de 1o 0, o preferiblemente, hay alguna manera de que mi modelo se actualice al recuperar (y antes de que se procese la vista) para transmitir trueo falsebasarse en es propiedad 1 o 0?

por ejemplo, los datos de mi modelo se ven como {"isChecked":"1"}cuando los necesito{"isChecked":true}

¡Muchas gracias por cualquier sugerencia que pueda tener!

Chris M
fuente
¿Cuál es la tecnología del lado del servidor utilizada?
Arun P Johny
PHP, la respuesta se escribe con un json_encode en el resultado de la consulta
Chris M
¿Intentaste con la forma: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Respuestas:

193

Todo lo que necesita es convertir stringa intcon +y convertir el resultado a booleano con !!:

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

Puedes hacer esta manipulación en el parsemétodo:

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

ACTUALIZACIÓN : 7 años después, la Number(string)conversión me parece más elegante. Además, mutar un objeto no es la mejor idea. Habiendo dicho eso:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
fuente
18
+1 Para convertir en intprimero. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry joven
76

Use un doble no:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
Dave
fuente
2
Esto funcionó para mí, pero por alguna razón tuve un todavía tenía que analizarlovalue = (!!parseInt(value) ? true : false)
Rick
Solo para estar seguro, !!2o cualquier otro número = false, ¿verdad?
Elijah Mock
No, !! 2 sería cierto, solo será falso para 0
dave
61

Aquí hay otra opción que es más larga pero que puede ser más legible:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
bmaupin
fuente
6
Legibilidad FTW!
zero_cool
7
En 2020, esta debería ser la respuesta
etiennejcharles
13

Asignación de comparación al valor de la propiedad

JavaScript

Puede asignar la comparación de la propiedad a "1"

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

Esto solo se evalúa para un valor de cadena de "1"aunque. Otras variables se evalúan como falsas, ya que una real typeof numbersería falsa. (es decir obj["isChecked"]=1)

Si desea ser indiscriminado con "1"o 1, puede usar:

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

Salidas de ejemplo

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

Mismo concepto en PHP

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

Se aplican las mismas limitaciones de operador que se indicaron anteriormente para JavaScript.

Doble no

El 'doble no' también funciona. Es confuso cuando la gente lo lee por primera vez, pero funciona en ambos idiomas para valores de tipo entero / numérico. Sin embargo, no funciona en JavaScript para valores de tipo de cadena, ya que siempre se evalúan como verdaderos:

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
fuente
buena idea Christopher, pude lograr esto escribiendo: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` en la función de inicialización de mi vista de la columna vertebral.
Chris M