क्या अजगर जैसे शब्दकोष हैं?


98

मुझे इस तरह से जावास्क्रिप्ट में एक शब्दकोश बनाने की आवश्यकता है

मुझे सटीक नोटेशन याद नहीं है, लेकिन यह कुछ इस तरह था:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }

क्या जावास्क्रिप्ट में ऐसी कोई बात है?


2
इस प्रश्न को देखें: stackoverflow.com/questions/130543/…
मनोज गोविंदन

5
आपके द्वारा स्वीकार किया गया उत्तर बहुत गलत है।
एबेन स्कोव पेडर्सन

@EsbenSkovPedersen उस उत्तर में आपको कौन सी त्रुटियां नज़र आईं?
एंडरसन ग्रीन

मुझे लगता है कि मैंने टिप्पणी करने के बाद इसे संपादित किया है। ऐसा लगता है: गायब था
एबेन स्कोव पेडर्सन

2
पढ़ें ES6 मैप्स के लिए सबसे हाल ही में इस सवाल का जवाब stackoverflow.com/a/32993723/1993919 (इसी कारण टिप्पणी यह पोस्ट किया गया)
पुराना Badman ग्रे

जवाबों:


129

यह एक पुरानी पोस्ट है, लेकिन मुझे लगा कि मुझे किसी भी तरह एक सचित्र जवाब देना चाहिए।

जावास्क्रिप्ट की वस्तु संकेतन का उपयोग करें। इस तरह:

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"]
};

11
यह ध्यान देने योग्य है कि पहले उदाहरण को बंद करने के अलावा बिल्कुल समान वाक्यविन्यास का उपयोग करते हुए दोनों भाषाओं में समान ऑब्जेक्ट का उत्पादन करना चाहिए। स्टेट्स_डाउन्टिक्स = {"सीटी": ["एलेक्स", "हैरी", "एके": ["लिज़ा", "एलेक्स"], "TX": ["फ्रेड", "हैरी"]}
डेनिस सी

मुझे शाब्दिक वस्तु संकेतन के लिए अधिक उपयोग किया जाता है, क्योंकि आप उन्हें उसी तरह एक्सेस करते हैं कि दोनों में क्या अंतर है?
जॉन डेमेट्रियौ

2
@JohnDemetriou मुख्य अंतर जावास्क्रिप्ट वस्तु संकेतन कुंजियों का तार होना चाहिए (दोहरे उद्धरण चिह्नों में संलग्न)। वस्तु संकेतन को JSON में डेटा इंटरचेज के लिए देखा जाता है और यह शाब्दिक वस्तु संकेतन से प्रेरित होता है; यह ध्यान देने योग्य है कि JSON आमतौर पर स्ट्रिंग संदर्भ में उपयोग किया जाता है
मुख्य

2
वास्तव में, पायथन बयान-समाप्ति अर्धविराम की अनुमति देता है, इसलिए पहला उदाहरण पायथन और जावास्क्रिप्ट दोनों में पूरी तरह से मान्य है
celticminstrel

मूल्य उपयोगकर्ता से आता है, तो परवाह की जरूरत है उपयोग करने के लिए उठाए जाने वाले Object.hasOwnProperty.call(dictionary, key)(अन्यथा उपयोगकर्ता के एक मूल्य में प्रवेश कर सकते valueOf और dictionary['valueOf']रिटर्न Object.valueOf()समारोह वस्तु प्रोटोटाइप जो शायद नहीं है कि आपके कोड उम्मीद करेंगे से संबंधित - संभावित बग या सुरक्षा मुद्दा )। यदि कुंजी एक स्ट्रिंग प्रकार नहीं है, तो देखभाल करने की आवश्यकता है, अन्यथा अंतर्निहित संख्यात्मक और स्थिर रूपांतरण आपको समस्याएं पैदा करेंगे। ES6 Mapप्रकार को शब्दकोशों के लिए विस्तारित कार्यक्षमता प्रदान करने के लिए डिज़ाइन किया गया है।
रोबोकट

48

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";

हालाँकि वस्तुओं के साथ यह सरणी सरणी के समान विशिष्ट गुण या विधियों का उपयोग करना संभव नहीं है। कम से कम "ऑब्जेक्ट-एरे" को एक इन-लूप में एक्सेस करना संभव है।


3
प्रदर्शन के बारे में क्या? लगातार समय में एक वस्तु को देख रहा है?
साहिर अहवाल

5
चूँकि ओ ["की"] जावास्क्रिप्ट में ओ के बराबर है। प्रदर्शन लगभग समान है। हालाँकि प्रदर्शन जावास्क्रिप्ट इंजन / वेबब्रोज़र पर निर्भर करता है। इनके बीच काफी अंतर हैं, खासकर पुराने संस्करणों में।
एलेक्स

ECMAScript 6 एक आधिकारिक मानचित्र ऑब्जेक्ट को परिभाषित करता है (यानी "जावास्क्रिप्ट में कोई वास्तविक साहचर्य सरणियाँ नहीं हैं" अब गलत है)।
रोबोकट

18

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन यह 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({});

मेरे लिए काम करता है, एक क्लीनर ES6 विधि का उपयोग करने के लिए अच्छा है। धन्यवाद! फॉलो अप, डे हम किसी भी तरह से "बल्क सेट ()", जैसे कि अजगर को जानते हैं dict = { key: value)?
जो सदोस्की

10

यहाँ 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 (कुंजी) और तानाशाही को हटाएं [कुंजी]

इस पोस्ट को इस कार्यान्वयन / उपयोग पर एक अच्छे संसाधन के रूप में पढ़ें। जावास्क्रिप्ट सहयोगी सरणी में गतिशील रूप से चाबियाँ बनाना

धन्यवाद!


5

जावास्क्रिप्ट वस्तुओं का उपयोग करें। आप एक शब्दकोश में चाबियाँ की तरह उनके गुणों का उपयोग कर सकते हैं। यह JSON की नींव है। वाक्यविन्यास पायथन शब्दकोशों के समान है। देखें: JSON.org


4

एक पुराना प्रश्न लेकिन मुझे हाल ही में एक एएस 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

1
अच्छा और उपयोगी पुस्तकालय! मैंने एक फ़ंक्शन प्राप्त किया है, जो मुझे लगा कि गायब है और कुछ मामूली वाक्यविन्यास मुद्दों (लापता अर्धविराम आदि) को निर्धारित किया है। यहाँ संशोधित फिडेल है
मैट

अच्छा काम दोस्त, वहाँ क्यों नहीं था!
मिकालोन

2

फ़ायरफ़ॉक्स 13+ अजगर में mapऑब्जेक्ट के समान ऑब्जेक्ट का प्रयोगात्मक कार्यान्वयन प्रदान करता है dictविनिर्देशों यहाँ

यह फ़ायरफ़ॉक्स में केवल avaible है, लेकिन यह ए की विशेषताओं का उपयोग करने से बेहतर दिखता है new Object()। प्रलेखन से उद्धरण:

  • ऑब्जेक्ट में एक प्रोटोटाइप होता है, इसलिए मैप में डिफ़ॉल्ट कुंजियाँ होती हैं। हालाँकि, इसका उपयोग करके बाईपास किया जा सकता है map = Object.create(null)
  • एक की कुंजी Objectहैं Strings, जहां वे एक के लिए किसी भी मूल्य हो सकता है Map
  • आप Mapआसानी से आकार प्राप्त कर सकते हैं जबकि आपको मैन्युअल रूप से a के लिए आकार का ट्रैक रखना होगा Object
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.