2017-11-06 31 views
13

मैं इस एकजावास्क्रिप्ट मानचित्र में इसकी कीमत से एक कुंजी कैसे प्राप्त करें?

let people = new Map(); 
people.set('1', 'jhon'); 
people.set('2', 'jasmein'); 
people.set('3', 'abdo'); 

की तरह एक js मानचित्र क्या मैं चाहता हूँ अपने मूल्य से एक चाबी वापस जाने के लिए कुछ विधि है

let jhonKey = people.getKey('jhon'); // jhonKey should be '1' 
+13

फिर आपने इसे गलत तरीके से क्यों स्टोर किया? :- पी – Bergi

उत्तर

14

आप कुंजी/मान सरणी के साथ एक सरणी में इसके लिए खोज के कर सकता है ।

यह

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 

पार्ट्स कैसे काम करता है:

   [...people] 

यह एक सरणी, जहां मूल्यों spread syntax ... जो Map.prototype[@@iterator]() चलाता है का उपयोग करके Map उदाहरण से आ रहे हैं के साथ काम करता इटरेटर जो एक ही परिणाम देता है (क्योंकि यह वही कार्य है) Map#entries के रूप में।

   [...people].find(([, v]) => v === 'jhon') 

एक सरणी में एक मूल्य खोजने के लिए, Array#find क्योंकि यह पहला तत्व है, जो पर कॉलबैक रिटर्न एक truthy मान देता है, काम में आता।

       ([, v]) => v === 'jhon' 
           ^^^^^ 

कॉलबैक के पैरामीटर सूची एक destructuring assignment होता है और एक सरणी का ही दूसरा तत्व लेता है, क्योंकि है कि समारोह के अंदर जांच करने के लिए मूल्य है।

   ([...people].find(([, v]) => v === 'jhon') || [])[0] 

एक मूल्य जो एक सरणी है, या अगर कोई तत्व पाया जाता है, जो undefined है पाया जाता है, और एक falsy मूल्य के रूप में व्यवहार करते हैं, तो एक logical OR || डिफ़ॉल्ट ऑपरेटर के रूप में एक खाली सरणी प्राप्त करने के लिए प्रयोग किया जाता है क्योंकि नतीजतन यह सरणी के पहले तत्व या undefined वापस नहीं मिलना चाहिए, अगर नहीं मिला।

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 

अंत में, परिणाम असाइन किया गया है।

let people = new Map(); 
 
people.set('1', 'jhon'); 
 
people.set('2', 'jasmein'); 
 
people.set('3', 'abdo'); 
 

 
let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0]; 
 

 
console.log(jhonKey);

+0

@ राजेश, वास्तव में, हमें कुंजी की आवश्यकता है, सूचकांक नहीं। –

+2

असल में हम महत्वपूर्ण सूचकांक या मूल्य नहीं की जरूरत है .. :) – Keith

+0

@NinaScholz मैं उत्सुक हूँ, क्या तुम सच में अपने काम में एक-लाइनर्स इस तरह का प्रयोग कर रहे हैं, और आप किसी भी तरह से अपने कोड डिबग कर रहे हैं या नहीं? – Engineer

16

आप map.entries सीधे पाश को for..of पाश का उपयोग और चाबी मिल सकती है।

function getByValue(map, searchValue) { 
 
    for (let [key, value] of map.entries()) { 
 
    if (value === searchValue) 
 
     return key; 
 
    } 
 
} 
 

 
let people = new Map(); 
 
people.set('1', 'jhon'); 
 
people.set('2', 'jasmein'); 
 
people.set('3', 'abdo'); 
 

 
console.log(getByValue(people, 'jhon')) 
 
console.log(getByValue(people, 'abdo'))

+4

इस समाधान के लिए एक लाभ संभवतः गति है, क्योंकि कोई सरणी परिवर्तन नहीं है। वास्तव में ES6 की भावना में प्राप्त करने के लिए हालांकि, अच्छा होगा यदि आप इसे ओर इशारा करते हुए के लिए धन्यवाद @Keith एक 'const' को' var' बदलने .. – Keith

+0

हो सकता है। इसे 'चलो' में अपडेट किया है। – Rajesh

+1

अच्छा एक। सिर्फ एक सिर ऊपर 'const' of' के लिए' में भी यहां काम करता है। यह इस संबंध में सामान्य 'के लिए काम नहीं करता है। – Keith

7

कोई प्रत्यक्ष विधि, इस दिशा में जानकारी चुनने के लिए नहीं है, इसलिए यदि आपके पास मानचित्र आप के रूप में दूसरों ने सुझाव दिया सेट के माध्यम से पाश की जरूरत है।

यदि नक्शा/सरणी/अन्य इतना बड़ा है कि ऐसा लूप एक प्रदर्शन समस्या होगी और एक रिवर्स लुकअप की आवश्यकता परियोजना के भीतर आम है, तो आप मानचित्र/सरणी/अन्य वर्तमान वस्तु के अनुसार एक और दूसरा कुंजी और मूल्य उलट के साथ। इस तरह रिवर्स लुकअप सामान्य के रूप में उतना ही कुशल है।बेशक, आपके पास ऐसा करने के लिए और अधिक काम है क्योंकि आपको एक या दोनों अंतर्निहित वस्तुओं को पास-थ्रू के रूप में आवश्यक प्रत्येक विधि को लागू करने की आवश्यकता है ताकि नक्शा छोटा हो और/या रिवर्स लुकअप की आवश्यकता न हो जीआईटी कंपाइलर को अनुकूलित करने के लिए बनाए रखने के लिए आसान और आसान आसान होने के कारण -विया-लूप विकल्प बेहतर होने की संभावना है।

किसी भी मामले में सावधान रहना एक संभावना है कि एकाधिक कुंजी के समान मूल्य हो सकता है। यदि यह संभव है तो अपने मानचित्र के माध्यम से लूपिंग करते समय आपको यह तय करने की ज़रूरत है कि क्या आप संभावित कुंजीों में से एक को मनमाने ढंग से वापस करने के लिए ठीक हैं (शायद पहले वाला) या यदि आप कुंजी की सरणी वापस करना चाहते हैं, और यदि एक रिवर्स इंडेक्स लागू करना है डेटा के लिए जो डुप्लिकेट मान हो सकता है, उसी मुद्दे को भी जिम्मेदार ठहराया जाना चाहिए।

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