मुझे इस तरह से जावास्क्रिप्ट में एक शब्दकोश बनाने की आवश्यकता है
मुझे सटीक नोटेशन याद नहीं है, लेकिन यह कुछ इस तरह था:
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
क्या जावास्क्रिप्ट में ऐसी कोई बात है?
मुझे इस तरह से जावास्क्रिप्ट में एक शब्दकोश बनाने की आवश्यकता है
मुझे सटीक नोटेशन याद नहीं है, लेकिन यह कुछ इस तरह था:
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
क्या जावास्क्रिप्ट में ऐसी कोई बात है?
जवाबों:
यह एक पुरानी पोस्ट है, लेकिन मुझे लगा कि मुझे किसी भी तरह एक सचित्र जवाब देना चाहिए।
जावास्क्रिप्ट की वस्तु संकेतन का उपयोग करें। इस तरह:
states_dictionary={
"CT":["alex","harry"],
"AK":["liza","alex"],
"TX":["fred", "harry"]
};
और मूल्यों तक पहुंचने के लिए:
states_dictionary.AK[0] //which is liza
या आप जावास्क्रिप्ट शाब्दिक वस्तु संकेतन का उपयोग कर सकते हैं, जिसके द्वारा कुंजियों को उद्धरणों में होना आवश्यक नहीं है:
states_dictionary={
CT:["alex","harry"],
AK:["liza","alex"],
TX:["fred", "harry"]
};
Object.hasOwnProperty.call(dictionary, key)(अन्यथा उपयोगकर्ता के एक मूल्य में प्रवेश कर सकते valueOf और dictionary['valueOf']रिटर्न Object.valueOf()समारोह वस्तु प्रोटोटाइप जो शायद नहीं है कि आपके कोड उम्मीद करेंगे से संबंधित - संभावित बग या सुरक्षा मुद्दा )। यदि कुंजी एक स्ट्रिंग प्रकार नहीं है, तो देखभाल करने की आवश्यकता है, अन्यथा अंतर्निहित संख्यात्मक और स्थिर रूपांतरण आपको समस्याएं पैदा करेंगे। ES6 Mapप्रकार को शब्दकोशों के लिए विस्तारित कार्यक्षमता प्रदान करने के लिए डिज़ाइन किया गया है।
2015 तक जावास्क्रिप्ट में कोई वास्तविक साहचर्य सरणियाँ नहीं थीं (ECMAScript 6 का विमोचन)। तब से आप रोबोकैट राज्यों के रूप में मैप ऑब्जेक्ट का उपयोग कर सकते हैं। एमडीएन में विवरण देखें । उदाहरण:
let map = new Map();
map.set('key', {'value1', 'value2'});
let values = map.get('key');
ES6 के समर्थन के बिना आप वस्तुओं का उपयोग करने की कोशिश कर सकते हैं:
var x = new Object();
x["Key"] = "Value";
हालाँकि वस्तुओं के साथ यह सरणी सरणी के समान विशिष्ट गुण या विधियों का उपयोग करना संभव नहीं है। कम से कम "ऑब्जेक्ट-एरे" को एक इन-लूप में एक्सेस करना संभव है।
मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन यह Google में तब पॉप अप होता है जब आप 'जावास्क्रिप्ट डिक्शनरी' खोजते हैं, इसलिए मैं उपरोक्त उत्तरों में जोड़ना चाहूंगा कि ECMAScript 6 में, आधिकारिक Mapवस्तु को पेश किया गया है, जो एक शब्दकोश है कार्यान्वयन:
var dict = new Map();
dict.set("foo", "bar");
//returns "bar"
dict.get("foo");
जावास्क्रिप्ट की सामान्य वस्तुओं के विपरीत, यह किसी भी वस्तु को एक कुंजी के रूप में अनुमति देता है:
var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");
//returns "Bar"
dict.get(bar);
//returns "Foo"
dict.get(foo);
//returns undefined, as {} !== foo and {} !== bar
dict.get({});
dict = { key: value)?
यहाँ JS में एक सरल शब्दकोश बनाया गया है:
function JSdict() {
this.Keys = [];
this.Values = [];
}
// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
JSdict.prototype.getVal = function (key) {
if (key == null) {
return "Key cannot be null";
}
for (var i = 0; i < this.Keys.length; i++) {
if (this.Keys[i] == key) {
return this.Values[i];
}
}
return "Key not found!";
}
}
// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
JSdict.prototype.update = function (key, val) {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
// Verify dict integrity before each operation
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Values[i] = val;
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
JSdict.prototype.add = function (key, val) {
// Allow only strings or numbers as keys
if (typeof (key) == "number" || typeof (key) == "string") {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
return "Duplicate keys not allowed!";
}
}
this.Keys.push(key);
this.Values.push(val);
}
else {
return "Only number or string can be key!";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
JSdict.prototype.remove = function (key) {
if (key == null) {
return "Key cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Keys.shift(key);
this.Values.shift(this.Values[i]);
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
var dict = new JSdict();
dict.add(1, "one")
dict.add(1, "one more")
"Duplicate keys not allowed!"
dict.getVal(1)
"one"
dict.update(1, "onne")
dict.getVal(1)
"onne"
dict.remove(1)
dict.getVal(1)
"Key not found!"
यह सिर्फ एक बुनियादी अनुकरण है। इसे कम से कम एक बेहतर रनिंग टाइम एल्गोरिथ्म को लागू करके अनुकूलित किया जा सकता है ताकि कम से कम O (nlogn) समय जटिलता या उससे भी कम में काम किया जा सके। जैसे एरे पर मर्ज / क्विक सॉर्ट और फिर लुकअप के लिए कुछ बी-सर्च। मैंने जेएस में एक हैश फ़ंक्शन को मैप करने के बारे में कोशिश नहीं की या खोज नहीं की।
इसके अलावा, JSdict obj के लिए कुंजी और मान को निजी चर में बदल दिया जा सकता है।
उम्मीद है की यह मदद करेगा!
EDIT >> उपरोक्त को लागू करने के बाद, मैंने व्यक्तिगत रूप से JS ऑब्जेक्ट्स को साहचर्य सरणियों के रूप में उपयोग किया है जो आउट-ऑफ-द-बॉक्स उपलब्ध हैं।
हालांकि , मैं दो तरीकों के बारे में एक विशेष उल्लेख करना चाहूंगा जो वास्तव में एक सुविधाजनक हैशटेबल अनुभव बनाने में मददगार साबित हुए।
विज़: तानाशाही ।wnProperty (कुंजी) और तानाशाही को हटाएं [कुंजी]
इस पोस्ट को इस कार्यान्वयन / उपयोग पर एक अच्छे संसाधन के रूप में पढ़ें। जावास्क्रिप्ट सहयोगी सरणी में गतिशील रूप से चाबियाँ बनाना
धन्यवाद!
एक पुराना प्रश्न लेकिन मुझे हाल ही में एक एएस 3> जेएस पोर्ट करने की आवश्यकता थी, और गति के लिए मैंने जेएस के लिए एक सरल एएस 3-शैली शब्दकोश वस्तु लिखी:
http://jsfiddle.net/MickMalone1983/VEpFf/2/
यदि आप नहीं जानते हैं, तो AS3 डिक्शनरी आपको किसी भी ऑब्जेक्ट को कुंजी के रूप में उपयोग करने की अनुमति देती है, जैसा कि सिर्फ स्ट्रिंग्स के विपरीत। आपके लिए एक बार उपयोग करने के बाद वे बहुत काम में आते हैं।
यह उतना तेज़ नहीं है जितना कि एक देशी वस्तु होगी, लेकिन मुझे इसके साथ कोई महत्वपूर्ण समस्या नहीं है।
एपीआई:
//Constructor
var dict = new Dict(overwrite:Boolean);
//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.
dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
console.log(key+' is key for '+value);
});
dict.get(key);//Get value from key
फ़ायरफ़ॉक्स 13+ अजगर में mapऑब्जेक्ट के समान ऑब्जेक्ट का प्रयोगात्मक कार्यान्वयन प्रदान करता है dict। विनिर्देशों यहाँ ।
यह फ़ायरफ़ॉक्स में केवल avaible है, लेकिन यह ए की विशेषताओं का उपयोग करने से बेहतर दिखता है new Object()। प्रलेखन से उद्धरण:
- ऑब्जेक्ट में एक प्रोटोटाइप होता है, इसलिए मैप में डिफ़ॉल्ट कुंजियाँ होती हैं। हालाँकि, इसका उपयोग करके बाईपास किया जा सकता है
map = Object.create(null)।- एक की कुंजी
ObjectहैंStrings, जहां वे एक के लिए किसी भी मूल्य हो सकता हैMap।- आप
Mapआसानी से आकार प्राप्त कर सकते हैं जबकि आपको मैन्युअल रूप से a के लिए आकार का ट्रैक रखना होगाObject।