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!


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

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

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.