Come convertire 1 in true o 0 in false durante il recupero del modello


97

Ho un modello impostato con una risposta JSON da un database mysql. I dati del modello vengono impostati con true o false in un campo booleano / tinyint nel database, che utilizza 1o 0.

A mio avviso, ho un'associazione che verifica la presenza di un valore booleano con trattino basso _.isBoolean. Ovviamente, quando il mio modello riceve i dati, viene impostato con 1o 0invece di vero o falso e il _.isBooleancontrollo fallisce.

C'è comunque un modo per avere correttamente la mia risposta JSON da mysql essere un valore booleano vero o falso invece di 1o 0, o preferibilmente, c'è un modo per fare in modo che il mio modello si aggiorni da solo al momento del recupero (e prima che la vista venga renderizzata) per il cast trueo in falsebase a è 1 o 0 proprietà?

ad esempio, i dati del mio modello sembrano {"isChecked":"1"}quando ne ho bisogno{"isChecked":true}

Grazie mille per i suggerimenti che potresti avere!


qual è la tecnologia lato server utilizzata?
Arun P Johny

PHP, la risposta viene scritta con un json_encode sul risultato della query
Chris M

hai provato con il modo: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Risposte:


191

Tutto ciò di cui hai bisogno è convertire stringin intcon +e convertire il risultato in booleano con !!:

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

Puoi eseguire questa manipolazione nel parsemetodo:

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

AGGIORNAMENTO : 7 anni dopo, trovo la Number(string)conversione più elegante. Anche la mutazione di un oggetto non è l'idea migliore. Detto ciò:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}

18
+1 Per la conversione in intprimo. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Young

76

Usa un doppio non:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);

2
Questo ha funzionato per me, ma per qualche motivo ho dovuto ancora analizzarlovalue = (!!parseInt(value) ? true : false)
Rick

Giusto per essere sicuri, !!2o qualsiasi altro numero = false, giusto?
Elijah Mock

No, !! 2 sarebbe vero, sarà falso solo per 0
dave

59

Ecco un'altra opzione più lunga ma potrebbe essere più leggibile:

Boolean(Number("0")); // false
Boolean(Number("1")); // true

6
Leggibilità FTW!
zero_cool

7
Nel 2020, questa dovrebbe essere la
risposta

13

Assegnazione del confronto al valore della proprietà

JavaScript

Potresti assegnare il confronto della proprietà a "1"

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

Questo valuta solo per un valore String di "1"sebbene. Altre variabili valutano false come una reale typeof numbersarebbe falsa. (cioè obj["isChecked"]=1)

Se vuoi essere indiscriminato su "1"o 1, potresti usare:

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

Output di esempio

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

Stesso concetto in PHP

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

Si applicano le stesse limitazioni dell'operatore sopra indicate per JavaScript.

Doppio non

Anche il "doppio non" funziona. È fonte di confusione quando le persone lo leggono per la prima volta, ma funziona in entrambe le lingue per valori di tipo intero / numero. Tuttavia, non funziona in JavaScript per i valori di tipo stringa poiché restituiscono sempre true:

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

buona idea Christopher, sono riuscito a raggiungere questo obiettivo scrivendo: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` nella funzione di inizializzazione del mio vista spina dorsale.
Chris M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.