web-dev-qa-db-ja.com

モデルの取得時に1をtrueに、または0をfalseに変換する方法

MysqlデータベースからのJSON応答で設定されたモデルがあります。モデルデータは、1または0を使用するデータベースのブール/ tinyintフィールドにtrueまたはfalseで設定されます。

私の見解では、アンダースコアの_.isBooleanでブール値をチェックするバインディングがあります。もちろん、モデルがデータを受信すると、trueまたはfalseではなく1または0で設定され、_.isBooleanチェックは失敗します。

とにかくmysqlからのJSON応答を1または0の代わりにブール値のtrueまたはfalseにすることができますか、できればフェッチ時にモデル自体を更新する方法がありますか(そしてビューがレンダリングされる前に)1または0プロパティに基づいてtrueまたはfalseをキャストしますか?

例えばモデルのデータは、{"isChecked":"1"}である必要があるとき、{"isChecked":true}のように見えます

ご意見をお寄せいただきありがとうございます!

62
Chris M

必要なのは、+stringintに変換し、!!で結果をブール値に変換することだけです。

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

parseメソッドでこの操作を行うことができます。

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

二重ではないを使用します:

!!1 = true;

!!0 = false;

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

長いが読みやすいかもしれない別のオプションを次に示します。

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

プロパティ値への比較の割り当て

JavaScript

プロパティの比較を"1"に割り当てることができます

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

ただし、これは"1"のString値に対してのみ評価されます。他の変数は、実際のtypeof numberがfalseになるようにfalseに評価されます。 (つまりobj["isChecked"]=1

"1"または1について無差別になりたい場合は、次を使用できます。

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

出力例

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

PHPの同じ概念

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

JavaScriptについて上記で説明したのと同じ演算子の制限が適用されます。

ダブルではない

「double not」も機能します。人々が最初にそれを読んだとき混乱しますが、整数/数値型の値に対して両方の言語で動作します。ただし、文字列型の値は常にtrueと評価されるため、JavaScriptでは機能しません。

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
7
SomeShinyObject

1'1'および'true'trueおよび0'0''false'nullおよびundefinedに変換しますfalse

function primitiveToBoolean(value?: string | number | boolean | null): boolean {
  if (value === 'true') {
    return true;
  }

  return typeof value === 'string'
    ? !!+value   // we parse string to integer first
    : !!value;
}

ユニットテストは次のとおりです。

describe('primitiveToBoolean', () => {
  it('should be true if its 1 / "1" or "true"', () => {
    expect(primitiveToBoolean(1)).toBe(true);
    expect(primitiveToBoolean('1')).toBe(true);
    expect(primitiveToBoolean('true')).toBe(true);
  });
  it('should be false if its 0 / "0" or "false"', () => {
    expect(primitiveToBoolean(0)).toBe(false);
    expect(primitiveToBoolean('0')).toBe(false);
    expect(primitiveToBoolean('false')).toBe(false);
  });
  it('should be false if its null or undefined', () => {
    expect(primitiveToBoolean(null)).toBe(false);
    expect(primitiveToBoolean(undefined)).toBe(false);
  });
  it('should pass through booleans - useful for undefined checks', () => {
    expect(primitiveToBoolean(true)).toBe(true);
    expect(primitiveToBoolean(false)).toBe(false);
  });
});

TypeScriptレシピ:エレガントな解析ブール値

0
am0wa