Como converter 1 em verdadeiro ou 0 em falso na busca do modelo

97

Eu tenho um modelo que é definido com uma resposta JSON de um banco de dados mysql. Os dados do modelo são configurados com true ou false em um campo booleano / tinyint no banco de dados, que usa 1ou 0.

Na minha opinião, tenho uma ligação que verifica se há um booleano com sublinhados _.isBoolean. Claro, quando meu modelo recebe os dados, ele é definido com 1ou em 0vez de verdadeiro ou falso e a _.isBooleanverificação falha.

Existe alguma maneira de fazer com que minha resposta JSON do mysql seja um valor booleano verdadeiro ou falso em vez de 1ou 0, ou preferencialmente, há uma maneira de fazer meu modelo se atualizar na busca (e antes que a visualização seja renderizada) para lançar trueou com falsebase em é 1 ou 0 propriedade?

por exemplo, os dados do meu modelo parecem {"isChecked":"1"}quando eu preciso que sejam{"isChecked":true}

Muito obrigado por qualquer sugestão que possa ter!

Chris M
fonte
qual é a tecnologia do lado do servidor usada?
Arun P Johny
PHP, a resposta está sendo escrita com um json_encode no resultado da consulta
Chris M
você tentou da maneira: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Respostas:

191

Tudo que você precisa é converter stringpara intcom +e converter o resultado em booleano com !!:

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

Você pode fazer essa manipulação no parsemétodo:

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

ATUALIZAÇÃO : 7 anos depois, acho a Number(string)conversão mais elegante. Além disso, transformar um objeto não é a melhor ideia. Dito isto:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
fonte
18
1 Para converter em intprimeiro. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Young
76

Use um duplo não:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
Dave
fonte
2
Isso funcionou para mim, mas por algum motivo eu ainda tinha que analisarvalue = (!!parseInt(value) ? true : false)
Rick
Só pra ter certeza, !!2ou qualquer outro número = false, certo?
Elijah Mock
Não, !! 2 seria verdadeiro, só seria falso para 0
dave
59

Aqui está outra opção mais longa, mas pode ser mais legível:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
bmaupin
fonte
6
Legibilidade FTW!
zero_cool
7
Em 2020, este deve ser o asnwer
etiennejcharles
13

Atribuição de comparação ao valor da propriedade

JavaScript

Você pode atribuir a comparação da propriedade para "1"

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

Isso só avalia um valor de String de "1"embora. Outras variáveis ​​são avaliadas como falsas, como se um real typeof numberfosse falso. (ie obj["isChecked"]=1)

Se você quiser ser indiscriminado sobre "1"ou 1, pode usar:

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

Saídas de exemplo

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

Mesmo conceito em PHP

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

As mesmas limitações do operador declaradas acima para JavaScript se aplicam.

Double Not

O 'não duplo' também funciona. É confuso quando as pessoas o leem pela primeira vez, mas funciona em ambas as línguas para valores de tipo inteiro / número. No entanto, não funciona em JavaScript para valores de tipo de string, pois eles sempre são avaliados como verdadeiros:

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
fonte
boa ideia Christopher, consegui fazer isso escrevendo: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` na função de inicialização do meu visão backbone.
Chris M