2015-12-31 7 views
5

मुझे पता है किकैसे "(एम [कुंजी] || (एम [कुंजी] = []))। पुश (elem);" काम?

(M[key] || (M[key] = [])).push(elem); 

आम समस्या

"यदि सरणी मौजूद सरणी के अंत करने के लिए इस तत्व पुश हल करने के लिए एक आम तरीका है, और अगर यह मौजूद नहीं है, सरणी को प्रारंभ करें और फिर तत्व को धक्का दें "

लेकिन वाक्यविन्यास कैसे टूट जाता है? यहां बताया गया है कि मैं इसे कैसे देखता हूं:

|| की उपस्थिति का अर्थ है कि उस ऑपरेटर के बाएं और दाएं जो भी हो, उसे बूलियन के रूप में व्याख्या किया जाता है। इसलिए M[key] और (M[key] = []) या तो बूलियन बयान हैं जो बूलियन में डाले जाते हैं। किसी भी मामले में, मुझे नहीं लगता कि (M[key] || (M[key] = []) के मूल्य पर कोई push कैसे कर सकता है। यहां क्या बकवास चल रही है?

+0

यह है के रूप में एक ही बात '(एम [कुंजी] = एम [कुंजी] || [])। धक्का (ELEM)' जिसका अर्थ है कि यदि 'एम [कुंजी]' एक ** falsy ** मान है, तो इसे एक खाली सरणी के रूप में शुरू किया जाएगा, और उसके बाद, तत्व 'elem' सरणी के अंत में जोड़ा जाएगा' एम [कुंजी] ' – jherax

उत्तर

3

यह वास्तव में जावास्क्रिप्ट में एक बहुत ही आम पैटर्न है।

आपको कुंजी से जुड़े सूची में एक तत्व जोड़ने की आवश्यकता है, यदि कोई अस्तित्व में नहीं है तो एक नई सूची बनाएं।

एक महत्वपूर्ण कोड है से जुड़े सूची प्राप्त करने के लिए:

M[key] 

लेकिन यह रिटर्न undefined अगर key मौजूद नहीं है।

जावास्क्रिप्ट || (तार्किक-या) ऑपरेटर का काफी उपयोगी अर्थशास्त्री है: यदि बायीं ओर सत्य है तो इसे वापस करें, अन्यथा मूल्यांकन करें और दाहिने तरफ वापस आएं। अभिव्यक्ति: इसलिए

M[key] || (M[key] = []) 

M[key] के साथ जुड़े सूची, वर्तमान हैं, अन्यथा हिस्सा (M[key] = []) मूल्यांकन किया जाता है देता है। यह काम करता है क्योंकि जावास्क्रिप्ट में एक सरणी (खाली होने पर भी) सत्य है और undefined गलत है।

असाइनमेंट ऑपरेटर = (जो जावास्क्रिप्ट में एक सामान्य ऑपरेटर है और अभिव्यक्ति के बीच में उपयोग किया जा सकता है) असाइनमेंट करता है तो उसके द्वारा निर्दिष्ट मूल्य को वापस देता है।

इस प्रकार पूरी चीज कुंजी से जुड़ी सूची लौटाती है या M में कुंजी अज्ञात होने पर एक नई खाली सूची बनाता है।

किसी सरणी में तत्व को धक्का देना <array>.push(x) है और डॉट के बाईं ओर भाग कोई अभिव्यक्ति हो सकता है।

(M[key] || (M[key] = [])).push(x); 

इसलिए बाएं हाथ की अभिव्यक्ति द्वारा वापस सूची में x जोड़ देगा।

"विस्तारित संस्करण इस प्रकार दिखाई देगा:

if (!M[key]) { 
    M[key] = []; 
} 
M[key].push(x); 

खबरदार है कि जावास्क्रिप्ट में शब्दकोशों के रूप में वस्तुओं का उपयोग कर, क्योंकि विरासत में मिला के कुछ सदस्यों देखभाल की आवश्यकता होती M = {} और key = "constructor" साथ उदाहरण के लिए कि कोड विफल हो जाएगा

+0

"उपयोगी" से मुझे लगता है कि आप उलझन में हैं –

+0

@SubparWebDev: नहीं। मुझे वास्तव में लगता है कि यह 'सत्य' या 'झूठी' लौटने के बजाए "पहला या दूसरा मान वापस लौटा" लॉजिकल और/या कई मामलों में काफी उपयोगी है । उदाहरण के लिए पाइथन में भी यही विचार अपनाया गया था और मुझे लगता है कि यह अक्सर कोड को पढ़ने में आसान बना सकता है ... – 6502

0

|| एक शॉर्ट-सर्किट ऑपरेटर है। इसका मतलब है कि अगर पहला आधा "सच्चाई" है तो यह दूसरी छमाही नहीं करता है। इसलिए यदि M[key] में एक मान (एक सत्य मूल्य) है जिसका उपयोग मूल्य है और हम कर रहे हैं। अन्यथा दूसरा भाग हो जाता है।

लंबे फ़ॉर्म को लिखित, आप हो सकता है: क्यों कम मुहावरा विकसित

if (M[key]) M[key].push(elem); 
    else { 
     M[key] = []; 
     M[key].push(elem); 
    } 

तो आप देख सकते।

+0

यदि आप कुछ वोट देने जा रहे हैं नीचे, कृपया एक टिप्पणी शामिल करने के लिए सौजन्य है कि क्यों, ताकि हम सुधार कर सकें। –

+1

^सहमत। यदि आपको प्रश्न पसंद नहीं है, तो बंद करने के लिए वोट दें, बाइट के बाहर सही सामग्री को कम न करें। –

+0

@ जॉन हस्कल हाँ उसने मेरे जवाब के लिए वही किया। – Hogan

0

संचालन के अपने आदेश का उपयोग करें! कोष्ठक का पालन करें।

(M[key] || (M[key] = [])).push(elem); 

इसे तोड़ दें। (M[key] || (M[key] = []))

|| OR ऑपरेटर है। तो यदि M[key] मौजूद है, तो push इसके लिए नया तत्व है। यदि नहीं, तो सरणी बनाएं और इसे जोड़ें।

यह एक सच्ची तुलना का मूल्यांकन करता है। (सच या अन्य)

0

ठीक है यहां कई चीजें चल रही हैं।

जावास्क्रिप्ट में एरे कैसे काम करते हैं। आप ARRAY_NAME [KEY_VALUE] का उपयोग कर सरणी तत्व को एक्सेस या असाइन कर सकते हैं।

इस प्रकार एम [कुंजी] मौजूद है यदि वस्तु मौजूद है।

इस कोड के आधार पर एम सरणी की सरणी है। तो जब एम [कुंजी] मूल्यांकन करता है तो यह एक सरणी या शून्य वापस कर देगा।

जब अभिव्यक्ति एक || बी जावास्क्रिप्ट में मूल्यांकन किया जाता है, यह छोटा सर्किट होता है और इसका मूल्यांकन बाएं से दाएं भी किया जाता है - यह है कि यदि कोई सत्य बी का मूल्यांकन कभी नहीं किया जाता है - यदि कोई गलत है तो बी का मूल्यांकन किया जाता है। (यह कई सी भाषाओं की तरह आम है।)

चूंकि एम [कुंजी] ऑब्जेक्ट वापस कर देगा यदि यह || कभी मूल्यांकन नहीं किया जाता है और उस कुंजी पर सरणी को नए elem को धक्का देने के लिए उपयोग किया जाता है।

यदि एम [कुंजी] में कुछ भी मौजूद नहीं है तो बी भाग का मूल्यांकन किया जाता है और इस मामले में बी भाग पहले एम [कुंजी] में स्थान पर खाली सरणी ([]) निर्दिष्ट करता है (जैसा कि हमने एम [कुंजी] असाइनमेंट के लिए भी इस्तेमाल किया जा सकता है) इस नए खाली सरणी का उपयोग तब किया जाता है (क्योंकि यह () के अंदर अभिव्यक्ति का मूल्यांकन करने का परिणाम है) ताकि नए elem को धक्का दिया जा सके।

https://en.wikipedia.org/wiki/Short-circuit_evaluation

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

0
।।

मैं इस निम्नलिखित तरीके understad: जावास्क्रिप्ट में अपरिभाषित के रूप में बुलियन गलत है

(M[key] || (M[key] = [])).push(elem); 
। 10

को निम्न तरीके से निष्पादित किया गया है: यदि एम [कुंजी] अपरिभाषित नहीं है - झूठी, अभिव्यक्ति का परिणाम एम [कुंजी] है।

यदि एम [कुंजी] अपरिभाषित है - झूठी, बूलियन का दूसरा भाग || -OR ऑपरेटर निष्पादित किया गया है और एम [कुंजी] एक मूल्य के रूप में खाली सरणी प्राप्त करता है। अभिव्यक्ति का परिणाम एम [कुंजी] है, लेकिन अब इसमें एक मूल्य के रूप में खाली सरणी है।

बाद में हम एम [कुंजी] सरणी में नया मान धक्का देते हैं: एम [कुंजी]। पुश (elem);

मुझे लगता है कि यह उपयोगी है javascript-operators-and-truthy-falsy

संबंधित मुद्दे