यदि जावास्क्रिप्ट में अशक्त या अपरिभाषित है तो एक मान बदलें


128

मुझे ??C # ऑपरेटर को जावास्क्रिप्ट पर लागू करने की आवश्यकता है और मुझे नहीं पता कि कैसे। C # में इस पर विचार करें:

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झूठे का मूल्यांकन किया जा सकता है, बल्कि बदलेगा ।
डीबीएस

क्या ग्रूवी में इसके लिए कोई समकक्ष है?
user6123723

यदि iअपरिभाषित है, तो यह एक त्रुटि फेंक देगा। इस तरह मेरे लिए बेकार लगता है .. (?)
phil294

@ phil294 var j = (i != null ? i : 10);काम करना चाहिए, क्योंकि undefinedहै ==अशक्त, इसलिए i != nullहै falseदोनों के लिए nullऔरundefined
टूलमेकरसैट

6

मुझे समस्या का आधा भाग मिला: मैं 'इंडेक्सर' नोटेशन का उपयोग ऑब्जेक्ट्स (my_object [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
@LinusGeffarth ध्यान दें कि यह मज़ेदार for inJS लूप केवल ऑब्जेक्ट शाब्दिक पर काम करता है! यह जेएस सरणियों (सूचकांक देता है) और जेएस मैप्स (देता है undefined) पर बुरी तरह से विफल रहता है । आशा है कि आप नहीं भूलेंगे, ऐसा न हो कि आप एक डीबगिंग आश्चर्य के लिए हैं! xP
वरुण

4

ES2020 उत्तर

नया Nullish Coalescing Operator, अंततः JavaScript पर उपलब्ध है, हालाँकि ब्राउज़र समर्थन सीमित है। कैनीयूज़ के आंकड़ों के अनुसार , केवल 48.34% ब्राउज़र समर्थित हैं (अप्रैल 2020 तक)।

प्रलेखन के अनुसार,

Nullish coalescing ऑपरेटर (??) एक तार्किक ऑपरेटर है जो अपने दाएं हाथ के साइड ऑपरेंड को वापस लौटाता है जब उसका लेफ्ट-हैंड साइड ऑपरेंड null या अपरिभाषित होता है, और अन्यथा उसका लेफ्ट-हैंड ऑपरेटर ऑपरेट करता है।

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

इससे यह सुनिश्चित होगा कि आपके चर के दोनों की फ़ॉलबैक मान होगा ''यदि filters[0]या filters[1]कर रहे हैं null, या undefined

ध्यान रखें कि nullish coalescing ऑपरेटर अन्य प्रकार के मिथ्या मूल्य जैसे 0और के लिए डिफ़ॉल्ट मान वापस नहीं करता है ''। यदि आप सभी झूठे मूल्यों के लिए जिम्मेदार हैं, तो आपको OR ऑपरेटर का उपयोग करना चाहिए ||


0

तार्किक nullish असाइनमेंट, 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.