Ganti nilai jika nol atau tidak ditentukan dalam JavaScript

128

Saya memiliki persyaratan untuk menerapkan ??operator C # ke JavaScript dan saya tidak tahu caranya. Pertimbangkan ini di C #:

int i?=null;
int j=i ?? 10;//j is now 10

Sekarang saya sudah menyiapkan ini di JavaScript:

var options={
       filters:{
          firstName:'abc'
       } 
    };
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter

Bagaimana cara melakukannya dengan benar?

Terima kasih.

EDIT: Saya melihat setengah dari masalah: Saya tidak dapat menggunakan notasi 'pengindeks' ke objek ( my_object[0]). Apakah ada cara untuk melewatinya? (Saya tidak tahu nama properti filter sebelumnya dan tidak ingin mengulanginya).

Valentin Vasilyev
sumber

Jawaban:

271

Berikut padanan JavaScript:

var i = null;
var j = i || 10; //j is now 10

Perhatikan bahwa operator logika|| tidak mengembalikan nilai boolean, tetapi nilai pertama yang dapat diubah menjadi true .

Selain itu, gunakan larik objek, bukan satu objek tunggal:

var options = {
    filters: [
        {
            name: 'firstName',
            value: 'abc'
        }
    ]
};
var filter  = options.filters[0] || '';  // is {name:'firstName', value:'abc'}
var filter2 = options.filters[1] || '';  // is ''

Itu bisa diakses dengan indeks.

Gumbo
sumber
57
Perhatikan bahwa ini tidak berfungsi jika 0 adalah nilai i yang valid.
jt000
13
Jika ada yang salah adalah input yang berpotensi valid ( 0,, falsestring kosong), saya akan melakukan sesuatu seperti ini: var j = (i === null) ? 10 : i;Yang hanya akan menggantikan null, daripada apa pun yang dapat dievaluasi menjadi salah.
DBS
Apakah ada padanan untuk ini di Groovy?
pengguna6123723
jika itidak ditentukan, ini akan membuat kesalahan. tampaknya tidak berguna bagi saya sehingga .. (?)
phil294
@ phil294 var j = (i != null ? i : 10);harus bekerja, karena undefinedadalah ==nol, sehingga i != nulladalah falseuntuk kedua nulldan undefined.
ToolmakerSteve
6

Saya melihat setengah dari masalah: Saya tidak dapat menggunakan notasi 'pengindeks' untuk objek (my_object [0]). Apakah ada cara untuk melewatinya?

Tidak; literal objek, seperti namanya, adalah objek , dan bukan array, jadi Anda tidak bisa begitu saja mengambil properti berdasarkan indeks, karena tidak ada urutan spesifik dari propertinya. Satu-satunya cara untuk mendapatkan kembali nilainya adalah dengan menggunakan nama tertentu:

var someVar = options.filters.firstName; //Returns 'abc'

Atau dengan mengulanginya menggunakan for ... inloop:

for(var p in options.filters) {
    var someVar = options.filters[p]; //Returns the property being iterated
}
Alex Rozanski
sumber
1
@LinusGeffarth Perhatikan bahwa for inloop JS lucu ini hanya bekerja pada literal objek! Ini gagal total pada array JS (memberi indeks) dan JS Maps (memberi undefined). Harap Anda tidak melupakannya, jangan sampai Anda akan terkejut dengan debugging! xP
varun
4

ES2020 Jawaban

Baru Nullish penggabungan operator, akhirnya tersedia pada JavaScript, meskipun dukungan browser terbatas. Menurut data dari caniuse , hanya 48,34% browser yang didukung (per April 2020).

Menurut dokumentasi,

Operator penggabungan nullish (??) adalah operator logika yang mengembalikan operan sisi kanannya saat operan sisi kirinya null atau tidak ditentukan, dan sebaliknya mengembalikan operan sisi kirinya.

const options={
  filters:{
    firstName:'abc'
  } 
};
const filter = options.filters[0] ?? '';
const filter2 = options.filters[1] ?? '';

Ini akan memastikan bahwa kedua variabel Anda akan memiliki nilai fallback ''if filters[0]atau filters[1]are null, atau undefined.

Perhatikan bahwa operator penggabungan nullish tidak mengembalikan nilai default untuk jenis nilai falsy lainnya seperti 0dan ''. Jika Anda ingin memperhitungkan semua nilai yang salah, Anda harus menggunakan operator ATAU ||.

gojun
sumber
0

Penugasan nullish logis, solusi 2020+

Operator baru sedang ditambahkan ke browser ??=,. Ini sama dengan value = value ?? defaultValue.

||=dan &&=juga datang, tautan di bawah.

Ini memeriksa apakah sisi kiri tidak ditentukan atau nol, hubungan pendek jika sudah ditentukan. Jika tidak, sisi kiri diberi nilai sisi kanan.

Contoh Dasar

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

// Equivalent to
a = a ?? true

Contoh Objek / Array

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

Contoh Fungsional

function config(options) {
    options.duration ??= 100
    options.speed ??= 25
    return options
}

config({ duration: 555 })   // { duration: 555, speed: 25 }
config({})                  // { duration: 100, speed: 25 }
config({ duration: null })  // { duration: 100, speed: 25 }

?? = Dukungan Browser Juli 2020 - .03%

?? = Dokumentasi Mozilla

|| = Dokumentasi Mozilla

&& = Dokumentasi Mozilla

Gibolt
sumber
0

Solusi perusak

Isi pertanyaan mungkin telah berubah, jadi saya akan mencoba menjawab dengan seksama.

Destrukturisasi memungkinkan Anda menarik nilai dari apa pun yang memiliki properti. Anda juga dapat menentukan nilai default ketika null / undefined dan name alias.

const options = {
    filters : {
        firstName : "abc"
    } 
}

const {filters: {firstName = "John", lastName = "Smith"}} = options

// firstName = "abc"
// lastName = "Smith"

CATATAN: Kapitalisasi penting

Jika bekerja dengan sebuah array, berikut adalah cara Anda melakukannya.

Dalam kasus ini, nama diekstrak dari setiap objek dalam larik, dan diberi aliasnya sendiri. Karena objek mungkin tidak ada = {}juga ditambahkan.

const options = {
    filters: [{
        name: "abc",
        value: "lots"
    }]
}

const {filters:[{name : filter1 = "John"} = {}, {name : filter2 = "Smith"} = {}]} = options

// filter1 = "abc"
// filter2 = "Smith"

Tutorial Lebih Detail

Dukungan Browser 92% Juli 2020

Gibolt
sumber