जावास्क्रिप्ट हैश नक्शा कैसे लागू किया जाता है?


88

मैं वर्तमान में OpenLayers के साथ काम करता हूं और वेक्टर लेयर (100000 से अधिक वैक्टर) में खींचने के लिए डेटा का एक विशाल सेट है।

मैं अब इन सभी वैक्टरों को प्रदर्शन का विश्लेषण करने के लिए जावास्क्रिप्ट हैश मैप में डालने की कोशिश कर रहा हूं। मैं जानना चाहता हूं कि जावास्क्रिप्ट में हैश मैप कैसे लागू किया जाता है, क्या यह एक वास्तविक हैश फ़ंक्शन या केवल एक लिपटे फ़ंक्शन है जो एक साधारण डेटा संरचना और एक खोज एल्गोरिथ्म का उपयोग करता है?


2
केवल एक जेएस कार्यान्वयन नहीं है, इसलिए इसका उत्तर देने का कोई तरीका नहीं है। ECMAScript में यह निर्दिष्ट नहीं किया गया है कि वस्तुओं के लिए किस डेटा संरचना का उपयोग करना है, और न ही यह एक्सेस समय पर प्रतिबंध निर्दिष्ट करता है। हाशिए विशिष्ट हैं, लेकिन संतुलित पेड़ों का उपयोग किया जा सकता है।
outis

1
ईएस 6 में शुद्ध नक्शे हैं। लिंक सादा वस्तु और मानचित्र, प्रमुख विवरण आदि के बीच अंतर का वर्णन करता है: MDN जावास्क्रिप्ट मानचित्र
डेन रोमन

जवाबों:


193

प्रत्येक जावास्क्रिप्ट ऑब्जेक्ट एक साधारण हैशमैप है जो एक स्ट्रिंग या सिंबल को अपनी कुंजी के रूप में स्वीकार करता है , इसलिए आप अपना कोड लिख सकते हैं:

var map = {};
// add a item
map[key1] = value1;
// or remove it
delete map[key1];
// or determine whether a key exists
key1 in map;

जावास्क्रिप्ट ऑब्जेक्ट इसके कार्यान्वयन पर एक वास्तविक हैशमैप है, इसलिए खोज पर जटिलता हे (1) है, लेकिन hashcode()जावास्क्रिप्ट स्ट्रिंग्स के लिए कोई समर्पित फ़ंक्शन नहीं है , इसे जावास्क्रिप्ट इंजन (वी 8, स्पाइडरमोंकी, JScript.dll, आदि) द्वारा आंतरिक रूप से कार्यान्वित किया जाता है। ।)

2020 अपडेट:

जावास्क्रिप्ट आज भी अन्य डेटाटाइप्स का समर्थन करता है: Mapऔर WeakMap। वे पारंपरिक वस्तुओं की तुलना में हैश मानचित्रों के रूप में अधिक बारीकी से व्यवहार करते हैं।


उत्तम। मैं इससे पहले $ ('div # someDiv') डेटा (कुंजी, मूल्य) का उपयोग कर रहा था और यह बहुत सरल है और शायद पुराने ब्राउज़रों के लिए भी बेहतर समर्थन है। धन्यवाद
स्वरूप

क्या मानचित्र की लंबाई खोजने का कोई तरीका है?
रोलिंग स्टोन

2
@ श्रीधर ने Object.keys (नक्शा) .length
otakustay

1
ध्यान दें कि आप एक संख्या को एक कुंजी के रूप में उपयोग कर सकते हैं, map[2] = 'foo'लेकिन यह आंतरिक रूप से एक स्ट्रिंग के लिए जाती है> map = { '2': 'foo' }
हैरी मोरेनो

@otakustay जो सुपर कूल फीचर था जो मुझे आज पता चला :) वास्तव में मुझे जावास्क्रिप्ट को करीब से जानने की जरूरत है।
पंकज प्रकाश

31

जावास्क्रिप्ट वस्तुओं को शुद्ध रूप से हैश मानचित्रों के शीर्ष पर लागू नहीं किया जा सकता है।

इसे अपने ब्राउज़र कंसोल में आज़माएँ:

var foo = {
    a: true,
    b: true,
    z: true,
    c: true
}

for (var i in foo) {
    console.log(i);
}

... और आप उन्हें वापस सम्मिलन क्रम में प्राप्त करेंगे, जो वास्तविक मानक व्यवहार है।

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

यहाँ लार्स बेक का एक वीडियो है जिसमें बताया गया है कि v8 वस्तुओं को लागू करने के लिए हैश मैप का उपयोग क्यों नहीं करता है


3
"ओटाकस्टे तकनीकी रूप से गलत है, सबसे खराब तरह का गलत है।" वह थोड़ा कठोर है। यह 1: 1 नहीं हो सकता है, लेकिन एक शब्दकोश की तरह हैश का उपयोग करने के इरादों और उद्देश्यों के लिए, यह एक ही फैशन में काम करता है।
संभवतः

1
बस यह स्पष्ट करना चाहते हैं कि यह जावास्क्रिप्ट के कुछ कार्यान्वयनों (जैसे अधिकांश ब्राउज़र) के लिए सही हो सकता है लेकिन जरूरी नहीं कि हमेशा सच हो। कुंजियों पर पुनरावृत्ति के आदेश को ECMAScript मानकों द्वारा परिभाषित नहीं किया गया है और यह कोई भी आदेश हो सकता है और फिर भी एक मान्य जेएस कार्यान्वयन हो सकता है।
theZ

19

यहाँ जावा मैप के समान कुछ का उपयोग करने का एक आसान और सुविधाजनक तरीका है :

var map= {
    'map_name_1': map_value_1,
    'map_name_2': map_value_2,
    'map_name_3': map_value_3,
    'map_name_4': map_value_4
    }

और मूल्य प्राप्त करने के लिए:

alert( map['map_name_1'] );    // fives the value of map_value_1

......  etc  .....

13

क्या आपको यह वर्ग आजमाना चाहिए Map:

var myMap = new Map();

// setting the values
myMap.set("1", 'value1');
myMap.set("2", 'value2');
myMap.set("3", 'value3');

myMap.size; // 3

// getting the values
myMap.get("1");    // "value associated with "value1"
myMap.get("2");       // "value associated with "value1"
myMap.get("3");      // "value associated with "value3"

सूचना: कुंजी और मूल्य किसी भी प्रकार का हो सकता है।

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


4

जबकि सादे पुराने जावास्क्रिप्ट ऑब्जेक्ट्स को नक्शे के रूप में इस्तेमाल किया जा सकता है, वे आमतौर पर अधिकांश ब्राउज़रों के साथ संगतता के लिए सम्मिलन-आदेश को संरक्षित करने के तरीके से लागू किए जाते हैं (क्रेग बार्न्स का उत्तर देखें) और इस प्रकार सरल हैश नक्शे नहीं हैं।

ES6 उचित मानचित्र प्रस्तुत करता है ( MDN जावास्क्रिप्ट मानचित्र देखें ) जिसमें से मानक कहते हैं :

मानचित्र ऑब्जेक्ट को या तो हैश टेबल या अन्य तंत्रों का उपयोग करके लागू किया जाना चाहिए, जो औसतन, संग्रह में तत्वों की संख्या के आधार पर एक्सेस टाइम प्रदान करते हैं।


1
<html>
<head>
<script type="text/javascript">
function test(){
var map= {'m1': 12,'m2': 13,'m3': 14,'m4': 15}
     alert(map['m3']);
}
</script>
</head>
<body>
<input type="button" value="click" onclick="test()"/>
</body>
</html>

0

मैं उस समस्या में भाग रहा था जहां मुझे कुछ सामान्य कुंजियों के साथ जौन था। मैं सभी मूल्यों को एक ही कुंजी के साथ समूहीकृत करना चाहता था। कुछ सर्फिंग के बाद मुझे हैशमैप पैकेज मिला । जो वास्तव में मददगार है।

तत्व को उसी कुंजी के साथ समूहित करने के लिए, मैंने उपयोग किया multi(key:*, value:*, key2:*, value2:*, ...)

यह पैकेज कुछ हद तक Java Hashmap संग्रह के समान है, लेकिन Java Hashmap जितना शक्तिशाली नहीं है।

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