জাভাস্ক্রিপ্টে শূন্য বা পূর্বনির্ধারিত হলে একটি মান প্রতিস্থাপন করুন


128

??জাভাস্ক্রিপ্টে আমার সি # অপারেটর প্রয়োগ করার প্রয়োজন রয়েছে এবং কীভাবে তা আমি জানি না। এটি সি # তে বিবেচনা করুন:

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

এখন আমি জাভাস্ক্রিপ্ট এ এই সেট আপ আছে:

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

আমি কীভাবে এটি সঠিকভাবে করব?

ধন্যবাদ।

সম্পাদনা: আমি সমস্যার অর্ধেকটি চিহ্নিত করেছি: আমি বস্তুগুলিতে 'সূচক' স্বরলিপি ব্যবহার করতে পারি না my_object[0]। এটিকে বাইপাস করার কোনও উপায় আছে কি? (আমি আগে থেকে ফিল্টারগুলির বৈশিষ্ট্যগুলির নাম জানি না এবং সেগুলির উপরে পুনরাবৃত্তি করতে চাই না)।

উত্তর:


271

এখানে জাভাস্ক্রিপ্ট সমতুল্য:

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

নোট করুন যে লজিকাল অপারেটর|| কোনও বুলিয়ান মান দেয় না তবে প্রথম মান যা সত্যে রূপান্তরিত হতে পারে

একটি একক বস্তুর পরিবর্তে অবজেক্টগুলির একটি অ্যারে ব্যবহার করুন:

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

সূচক দ্বারা এটি অ্যাক্সেস করা যেতে পারে।


57
মনে রাখবেন যে 0 যদি i এর বৈধ মান হয় তবে এটি কাজ করে না।
jt000

13
মিথ্যা কিছু যদি কোনও সম্ভাব্য বৈধ ইনপুট ( 0,, falseখালি স্ট্রিং) হয় তবে আমি এর পরিবর্তে এরকম কিছু var j = (i === null) ? 10 : i;করব : যা nullমিথ্যা হিসাবে মূল্যায়ন করা যায় তার চেয়ে কেবল প্রতিস্থাপন করবে ।
ডিবিএস

গ্রোভিতে এর সমতুল্য কি আছে?
ব্যবহারকারী 6123723

যদি অপরিবর্তিত iথাকে তবে এটি একটি ত্রুটি ছুঁড়ে দেবে। এভাবে আমার কাছে অকেজো মনে হচ্ছে .. (?)
phil294

@ phil294 var j = (i != null ? i : 10);কাজ করা উচিত, কারণ undefinedহয় ==, নাল তাই i != nullহয় falseউভয়ের জন্য nullএবং undefined
টুলমেকারস্টেভ

6

আমি সমস্যার অর্ধেক অংশ চিহ্নিত করেছি: আমি বস্তুর প্রতি 'ইনডেক্সার' স্বরলিপি ব্যবহার করতে পারি না (মাই_বজেক্ট [0])। এটিকে বাইপাস করার কোনও উপায় আছে কি?

না; নাম হিসাবে বোঝা যায় যে কোনও বস্তু আক্ষরিক, একটি বস্তু , এবং কোনও অ্যারে নয়, সুতরাং কোনও সূচকের উপর ভিত্তি করে আপনি কোনও সম্পত্তি পুনরুদ্ধার করতে পারবেন না, কারণ তাদের বৈশিষ্ট্যের কোনও নির্দিষ্ট ক্রম নেই। তাদের মানগুলি পুনরুদ্ধারের একমাত্র উপায় নির্দিষ্ট নামটি ব্যবহার করে:

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

বা for ... inলুপ ব্যবহার করে তাদের উপর পুনরাবৃত্তি দ্বারা :

for(var p in options.filters) {
    var someVar = options.filters[p]; //Returns the property being iterated
}

1
@ লিনাসগেফার্থ নোট করুন যে এই মজার for inজেএস লুপটি কেবল অবজেক্ট লিটারালগুলিতে কাজ করে! এটি জেএস অ্যারেগুলিতে খারাপভাবে ব্যর্থ হয় (সূচক দেয়) এবং জেএস মানচিত্র (দেয় undefined)। আশা করি আপনি এটি ভুলে যাবেন না, পাছে আপনি কোনও ডিবাগিং চমকের জন্য রয়েছেন! এক্সপি
বেনুন

4

ES2020 উত্তর

ব্রাউজার সমর্থন সীমাবদ্ধ থাকলেও নতুন নুলিশ কোলসিং অপারেটরটি শেষ পর্যন্ত জাভাস্ক্রিপ্টে উপলব্ধ on ক্যানিউজ থেকে প্রাপ্ত তথ্য অনুযায়ী , কেবলমাত্র 48.34% ব্রাউজারই সমর্থিত (2020 এপ্রিল পর্যন্ত)।

ডকুমেন্টেশন অনুযায়ী,

নালিশ কোয়েলসিং অপারেটর (??) একটি লজিকাল অপারেটর যা তার ডান হাতের অপারেন্ডটি বাম-হাতের অপারেন্ডটি নাল বা অপরিজ্ঞাতকৃত অবস্থায় ফিরিয়ে দেয় এবং অন্যথায় তার বাম-হাতের অপারেন্ডটি দেয়।

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

এর ফলে আপনার ভেরিয়েবল উভয় একটি ফলব্যাক মান থাকবে ''যদি filters[0]বা filters[1]হয় null, অথবা undefined

নোটিশ coalescing অপারেটর যেমন 0এবং অন্যান্য ধরণের মিথ্যা মান হিসাবে ডিফল্ট মান ফিরে আসে না তা নোট করুন ''। আপনি যদি সমস্ত মিথ্যা মানগুলির জন্য অ্যাকাউন্ট করতে চান তবে আপনার ওআর অপারেটরটি ব্যবহার করা উচিত ||


0

লজিকাল নালিশ নিয়োগ, 2020+ সমাধান

ব্রাউজারগুলিতে বর্তমানে একটি নতুন অপারেটর যুক্ত করা হচ্ছে ??=,। এটি সমানvalue = value ?? defaultValue

||=এবং &&=আসছে, নীচের লিঙ্ক।

বাম দিকটি অপরিশোধিত বা নাল, শর্ট সার্কিট যদি ইতিমধ্যে সংজ্ঞায়িত হয় তবে এটি পরীক্ষা করে। যদি তা না হয় তবে বাম দিকটি ডান পাশের মান নির্ধারিত হয়।

বেসিক উদাহরণ

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

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

// Equivalent to
a = a ?? true

বস্তু / অ্যারে উদাহরণ

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" }

কার্যকরী উদাহরণ

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 }

?? = ব্রাউজার সমর্থন 2020 জুলাই - .03%

?? = মজিলা ডকুমেন্টেশন

|| = মজিলা ডকুমেন্টেশন

&& = মজিলা ডকুমেন্টেশন


0

সমাধান সমাধান

প্রশ্নের সামগ্রী পরিবর্তিত হতে পারে, তাই আমি ভাল করে উত্তর দেওয়ার চেষ্টা করব।

ধ্বংস করা আপনাকে বৈশিষ্ট্য সহ যে কোনও কিছু থেকে মানগুলি টেনে আনতে দেয়। নাল / অপরিজ্ঞাত এবং নামের উপাধি দেওয়া হলে আপনি ডিফল্ট মানগুলিও সংজ্ঞায়িত করতে পারেন।

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

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

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

দ্রষ্টব্য: মূলধন বিষয়গুলি

যদি কোনও অ্যারের সাথে কাজ করা হয় তবে আপনি এটি কীভাবে করবেন তা এখানে।

এই ক্ষেত্রে অ্যারেতে প্রতিটি বস্তু থেকে নাম বের করা হয় এবং তার নিজস্ব নাম দেওয়া হয়। যেহেতু অবজেক্টটি উপস্থিত নাও থাকতে পারে তা = {}যুক্ত করা হয়েছিল।

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

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

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

আরও বিস্তারিত টিউটোরিয়াল

ব্রাউজার সমর্থন 92% জুলাই 2020

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.