2012-03-14 18 views
6

मुझे समझ में आता है कि यह थोड़ा अपरंपरागत है।मैं इसके मूल्य का उपयोग करके एक प्रमुख नाम (हैश में) कैसे प्राप्त कर सकता हूं?

आइए कहें कि मेरे पास यह हैश है।

someHash = { 
    'item1' => '5', 
    'item2' => '7', 
    'item3' => '45', 
    'item4' => '09' 
} 

देशी जे एस, या प्रोटोटाइप या jQuery का उपयोग करना - वहाँ एक तरीका है कि मुझे सिर्फ मूल्य होने से "कुंजी का नाम" प्राप्त करने के लिए सक्षम हो जाएगा है?

मुझे सभी चाबियाँ नहीं चाहिए, सिर्फ मेरे मूल्य से मेल खाता है। रिवर्स में एक मानचित्र की तरह सॉर्टा?

मुझे डीबी से वापसी मिल रही है जिसे मुझे "मूल्य" मिलता है और मुझे उस मूल्य से पहले जेएस हैश के साथ मेल करना होगा।

तो ऐप मुझे "45" हाथ देता है ... क्या कुंजी "item3" प्राप्त करने के लिए जेएस (प्रोटोटाइप या jquery) का उपयोग करने का कोई तरीका है?

+2

आप हर एक मुख्य/मान जोड़े और वापसी पर पुनरावृति करना होगा पहली कुंजी जिसमें आपका मान शामिल है। – Blender

+0

हैश इस तरह से काम नहीं करते हैं। वे मूल्य प्राप्त करने के लिए कुंजी का कुशल लुकअप प्रदान करते हैं।जब तक आप मिलान मूल्य नहीं पाते हैं, तब तक दूसरी तरफ हर संभव कुंजी (संभवतः) की पुनरावृत्ति की आवश्यकता होती है। बस कुंजी और मूल्य की अपनी परिभाषा को उलट दें। –

+0

सामान्य सरणी के लिए, आप '.indexOf' का उपयोग कर सकते हैं, लेकिन आप ऑब्जेक्ट तत्वों के माध्यम से लूपिंग के बारे में बात कर रहे हैं। – Brad

उत्तर

4

कुंजी प्राप्त करने के लिए जो किसी दिए गए मान पर नक्शा आपको ऑब्जेक्ट गुणों को खोजने की आवश्यकता होगी। उदाहरण

function getKeysForValue(obj, value) { 
    var all = []; 
    for (var name in obj) { 
    if (Object.hasOwnProperty(name) && obj[name] === value) { 
     all.push(name); 
    } 
    } 
    return all; 
} 
+0

क्या होगा यदि मान एक सरणी है? जैसे {ए: ['बी', 'सी', 'डी']} – Jazmin

2

कोई सीधी विधि नहीं है लेकिन आप इस तरह कुछ कोशिश कर सकते हैं।

var key; 
$.each(someHash, function(key, val){ 
    if(val == 'valToCompare'){ 
     key = key; 
     return false; 
    } 
}); 
+0

'ब्रेक' काम नहीं करता है क्योंकि आपके पास वास्तविक लूप नहीं है। आपको 'झूठी वापसी' की आवश्यकता है। – pimvdb

+0

'ब्रेक 'का कोई अर्थ नहीं है – kirilloid

+0

सही, धन्यवाद। – ShankarSangoli

2

विशिष्टता के बिना आप पहली बार प्राप्त कर सकते हैं:

var hash = {item1: 0, item2: 1}, 
    value = 1, 
    key; 
for(var i in hash) 
{ 
    if (hash.hasOwnProperty(i) && hash[i] === value) { 
     key = i; 
     break; 
    } 
} 
key; // item2 

hasOwnProperty सुनिश्चित करता है हैश संपत्ति है न कि एक प्रोटोटाइप।

break कुंजी मिलने के बाद लूप को रोकता है।

2

के लिए मैं एक देशी जवाब के बारे में पता नहीं है, लेकिन आप अपने खुद के लिख सकते हैं:

var someHash = { 
    'item1' : '5', 
    'item2' : '7', 
    'item3' : '45', 
    'item4' : '09' 
}; 

function getKeyByValue(hash, value) { 
    var key; 
    for(key in hash) { 
    if (hash[key] == value) return key; 
    } 
} 

alert(getKeyByValue(someHash, '7')); 
0

शायद array_flip आप मदद कर सकता है। यह एक नई सरणी बनाता है जहां कुंजी मान हैं और इसके विपरीत। फिर, उस नई सरणी में केवल कुंजी की तलाश करें, और परिणामी मान उस मूल सरणी में कुंजी है जिसे आप ढूंढ रहे थे।

0

ऑब्जेक्ट के माध्यम से लूप।

function findInObj(obj, needle) 
    for(var x in obj){ 
     if(obj.x==needle) return x; 
    } 
    return false; 
} 
+0

वाह। उत्तर इस साइट पर तेजी से आते हैं। – whiteatom

+2

'obj.x' होना चाहिए 'obj [x]' –

0

के बाद से एक वस्तु में एक से अधिक संपत्ति एक ही मूल्य, आप संपत्ति ऐसे नाम हैं जो मान से मेल की एक सरणी लौट सकता है हो सकता है।

var someHash={ 
    'item1':'5', 
    'item2':'7', 
    'item3':'45', 
    'item4':'09', 
    'item5':'7' 
} 
function hasAny(what){ 
    var names= []; 
    for(var p in this){ 
     if(this[p]=== what) names.push(p); 
    } 
    return names; 
} 

hasAny.call (someHash, '7');

/* दिए गए मान: (सरणी) ITEM2, item5 */

4

का उपयोग Underscore.js:

_.invert(someHash)[value] 
संबंधित मुद्दे

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