Cara mengonversi 1 menjadi benar atau 0 menjadi salah saat pengambilan model

99

Saya memiliki model yang disetel dengan respons JSON dari database mysql. Data model disetel dengan true atau false ke dalam bidang boolean / tinyint dalam database, yang menggunakan 1atau 0.

Dalam pandangan saya, saya memiliki pengikatan yang memeriksa boolean dengan garis bawah _.isBoolean. Tentu saja, ketika model saya menerima data, sudah diatur dengan 1atau 0bukan benar atau salah dan _.isBooleancek gagal.

Apakah ada cara agar respons JSON saya dari mysql benar menjadi nilai boolean true atau false alih-alih 1atau 0, atau lebih disukai, apakah ada cara agar model saya memperbarui dirinya sendiri setelah diambil (dan sebelum tampilan render) untuk dilemparkan trueatau falseberdasarkan itu 1 atau 0 properti?

misalnya, data model saya terlihat seperti {"isChecked":"1"}saat saya membutuhkannya{"isChecked":true}

Terima kasih banyak atas saran yang mungkin Anda miliki!

Chris M.
sumber
apa teknologi sisi server yang digunakan?
Arun P Johny
PHP, respons sedang ditulis dengan json_encode pada hasil kueri
Chris M
apakah Anda mencoba dengan cara: isChecked = isChecked? true: false
Ulug'bek Ro'zimboyev

Jawaban:

193

Yang Anda butuhkan hanyalah mengonversi stringmenjadi intdengan +dan mengubah hasilnya menjadi boolean dengan !!:

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

Anda dapat melakukan manipulasi ini dengan parsemetode:

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

UPDATE : 7 tahun kemudian, saya menemukan Number(string)konversi lebih elegan. Juga mutasi suatu objek bukanlah ide terbaik. Yang telah dibilang:

parse: function (response) {
  return Object.assign({}, response, {
    isChecked: !!Number(response.isChecked), // OR
    isChecked: Boolean(Number(response.isChecked))
  });
}
Vitalii Petrychuk
sumber
18
+1 Untuk mengubah menjadi yang intpertama. !!+"1"; // true, !!+"0"; // false, !!+1; // true, !!+0; // false
Terry Muda
76

Gunakan ganda bukan:

!!1 = true;

!!0 = false;

obj.isChecked = !!parseInt(obj.isChecked);
dave
sumber
2
Ini berhasil untuk saya tetapi untuk beberapa alasan saya memiliki dan saya masih harus menguraikannyavalue = (!!parseInt(value) ? true : false)
Rick
Hanya untuk memastikan, !!2atau nomor lain = false, bukan?
Elijah Mock
Tidak, !! 2 akan benar, itu hanya akan salah untuk 0
dave
61

Berikut opsi lain yang lebih panjang tetapi mungkin lebih mudah dibaca:

Boolean(Number("0")); // false
Boolean(Number("1")); // true
bmaupin
sumber
6
Keterbacaan FTW!
zero_cool
7
Pada tahun 2020, ini harus menjadi asnwer
etiennejcharles
13

Menetapkan Perbandingan untuk nilai properti

JavaScript

Anda dapat menetapkan perbandingan properti tersebut "1"

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

Ini hanya mengevaluasi nilai String dari "1". Variabel lain dievaluasi menjadi salah seperti aktual typeof numberakan menjadi salah. (yaitu obj["isChecked"]=1)

Jika Anda ingin tidak pandang bulu tentang "1"atau 1, Anda dapat menggunakan:

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

Contoh Keluaran

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

Konsep yang sama di PHP

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

Batasan operator yang sama seperti yang disebutkan di atas untuk JavaScript berlaku.

Ganda Tidak

'Jangan ganda' juga berfungsi. Ini membingungkan ketika orang pertama kali membacanya tetapi berfungsi dalam kedua bahasa untuk nilai tipe integer / angka. Namun itu tidak berfungsi di JavaScript untuk nilai jenis string karena selalu bernilai 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
SomeShinyObject
sumber
ide bagus Christopher, saya dapat mencapai ini dengan menulis: `this.model.set ('isChecked', (this.model.get ('isChecked') === '1'))` di inisialisasi fungsi saya tampilan tulang punggung.
Chris M