जावास्क्रिप्ट साहचर्य सरणी में गतिशील रूप से चाबियाँ बनाना


199

मैं जावास्क्रिप्ट साहचर्य सरणियों में गतिशील रूप से चाबियाँ कैसे बना सकता हूं?

अब तक मिले सभी दस्तावेज़ों में पहले से निर्मित कुंजियों को अद्यतन करना है:

 arr['key'] = val;

मेरे पास इस तरह से एक स्ट्रिंग है " name = oscar "

और मैं कुछ इस तरह से समाप्त करना चाहता हूं:

{ name: 'whatever' }

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

कोड

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.

24
सुविधा के लिए यूजीन के जवाब के लिए जंप लिंक
user56reinstatemonica8

जवाबों:


142

पहले उदाहरण का उपयोग करें। यदि कुंजी मौजूद नहीं है तो इसे जोड़ा जाएगा।

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

'ऑस्कर' वाले संदेश बॉक्स को पॉप अप करेगा।

प्रयत्न:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );

मुझे लगता है कि फ़ायरफ़ॉक्स में एक नमूने के रूप में सिर्फ यकीन है कि भाग गया। क्या आपने उद्धरणों में 'नाम' डालना सुनिश्चित किया है?
tvanfosson

1
उह, नहीं, क्योंकि, मैं कुंजी "गतिशील" बना रहा हूं, सांख्यिकीय रूप से नहीं। मुझे वैसे भी
डबलचेक करें

2
कृपया डैनी के अधिक पूर्ण स्पष्टीकरण का संदर्भ लें। आप अनुक्रमणिका के साथ लूप के लिए सरणी मानों को संदर्भित करने में सक्षम नहीं होंगे (जैसे कि मायार्रे [i])। आशा है कि बहुत भ्रामक नहीं है।
एमके_डेव

4
इससे भी बेहतर एक वस्तु (ब्रैकेट {} संकेतन) का उपयोग करना है। होने की ओवरहेड से बचने के लिए .length, .slice (), आदि जो ऐरे प्रोटोटाइप में शामिल हैं
bjornl

488

किसी भी तरह से काम करते समय, सभी उदाहरणों का ओवरकम्प्लिकेट किया जाता है:

  • वे उपयोग करते हैं new Array() , जो एक साधारण साहचर्य सरणी (AKA शब्दकोश) के लिए एक ओवरकिल (और एक ओवरहेड) है।
  • बेहतर उपयोग करते हैं new Object()। ठीक काम करता है, लेकिन यह सब अतिरिक्त टाइपिंग क्यों?

इस प्रश्न को "शुरुआती" टैग किया गया है, तो चलिए इसे सरल बनाते हैं।

उबेर-सरल तरीका जावास्क्रिप्ट में एक शब्दकोश का उपयोग करें या "क्यों जावास्क्रिप्ट में एक विशेष शब्दकोश वस्तु नहीं है?"

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

अब मान बदलते हैं:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

मान हटाना भी आसान है:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}

2
नमस्कार, मुझे पता है कि मैं पुराने उत्तर का उत्तर दे रहा हूं, लेकिन यह Google पर उच्च स्थान पर है, इसलिए मैं वैसे भी पूछूंगा। मैं इस उलझन में हूँ कि "हम मूल गुप्त कुंजी को नहीं जोड़ सकते क्योंकि यह गतिशील थी, हम आपके उदाहरण में केवल स्थैतिक कुंजियाँ जोड़ सकते हैं"।
कारेल बिलेक

1
इसका ठीक यही अर्थ है कि यह क्या कहता है: हम इसके मूल्य को नहीं जानते हैं, इसलिए हम इसे एक स्थिरांक के रूप में प्रस्तुत नहीं कर सकते हैं, जो एक वस्तु शाब्दिक में एक कुंजी निर्दिष्ट करते समय आवश्यक है।
यूजीन लाजुटकिन

3
हालाँकि, "हम मूल गुप्त कुंजी नहीं जोड़ सकते क्योंकि यह गतिशील था" अपने आप से सही नहीं है, भले ही आप एक चर का उपयोग सीधे {} में कुंजी के रूप में नहीं कर सकते, या डॉट-नोटेशन के साथ एक कुंजी के रूप में कर सकते हैं। जैसा कि आप उदाहरण में दिखाते हैं, हम अभी भी "तानाशाह [कुंजी] = वैल" के माध्यम से एक गतिशील कुंजी जोड़ सकते हैं। सीमा कुंजी के बजाय {} -नोटेशन का उपयोग करने के साथ है।
जुत

8
यह शेल्डन कूपर के उत्तर की तरह दिखता है :)
jpatiaga

4
संपूर्ण पूर्ण उत्तर, डिफ़ॉल्ट होना चाहिए
डेनिस गोलोमेज़ोव

29

जावास्क्रिप्ट में साहचर्य सरणियां नहीं हैं , इसमें ऑब्जेक्ट हैं

कोड की निम्नलिखित पंक्तियाँ सभी एक ही काम करती हैं - किसी ऑब्जेक्ट पर 'नाम' फ़ील्ड को 'ओरियन' पर सेट करें।

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

ऐसा लगता है कि आपके पास एक सहयोगी सरणी है क्योंकि Arrayयह भी एक है Object- हालांकि आप वास्तव में सरणी में चीजों को बिल्कुल नहीं जोड़ रहे हैं, आप ऑब्जेक्ट पर फ़ील्ड सेट कर रहे हैं।

अब जब यह साफ हो गया है, तो यहां आपके उदाहरण के लिए एक कार्यशील समाधान है

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.

मान लें कि टेक्स्ट स्ट्रिंग में वास्तव में घुंघराले ब्रेसिज़ हैं, तो आप इसे JSON के रूप में अधिक या कम मान सकते हैं .. के साथ = को प्रतिस्थापित करें: और आपको eval करने के लिए एक ऑब्जेक्ट मिला है ..
neonski

1
ओह, स्ट्रिंग ठीक से सीमांकित नहीं है। कुछ भी regex ठीक नहीं कर सकता।
नींस्की

9

MK_Dev के जवाब में, कोई पुनरावृति करने में सक्षम है, लेकिन लगातार नहीं (इसके लिए स्पष्ट रूप से एक सरणी की आवश्यकता है)

त्वरित Google खोज जावास्क्रिप्ट में हैश टेबल लाती है

एक हैश में मूल्यों पर पाशन के लिए उदाहरण कोड (उपरोक्त लिंक से):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

5

मूल कोड (मैंने लाइन संख्या जोड़ी ताकि उन्हें संदर्भित कर सकें):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

लगभग वहाँ पहुँच गया...

  • पंक्ति 1: आपको trimपाठ पर करना चाहिए ताकि यह हो name = oscar
  • पंक्ति 3: जब तक आप हमेशा अपने बराबर स्थान रखते हैं, ठीक है। बेहतर हो सकता है कि trimपंक्ति 1 में न हों , =प्रत्येक की-वेल्यूपीयर का उपयोग करें और ट्रिम करें
  • 3 के बाद और 4 से पहले एक पंक्ति जोड़ें:

    key = keyValuePair[0];`
  • पंक्ति 4: अब बन गई है:

    dict[key] = keyValuePair[1];
  • पंक्ति 5: इसमें बदलें:

    alert( dict['name'] );  // it will print out 'oscar'

मैं जो कहना चाह रहा हूं वह यह है कि dict[keyValuePair[0]]काम नहीं करता है, आपको keyValuePair[0]साहचर्य कुंजी के रूप में एक स्ट्रिंग सेट करने और उपयोग करने की आवश्यकता है । यही एक तरीका है जिससे मुझे काम करने का मौका मिला। आपके द्वारा इसे सेट करने के बाद आप इसे या तो संख्यात्मक सूचकांक या उद्धरण में कुंजी के साथ संदर्भित कर सकते हैं।

उम्मीद है की वो मदद करदे।


4

सभी आधुनिक ब्राउज़र एक मैप का समर्थन करते हैं , जो एक कुंजी / मूल्य डेटा सख्ती है। ऐसे कुछ कारण हैं जो किसी ऑब्जेक्ट से बेहतर मैप का उपयोग करते हैं:

  • ऑब्जेक्ट में एक प्रोटोटाइप होता है, इसलिए मैप में डिफ़ॉल्ट कुंजियाँ होती हैं।
  • किसी ऑब्जेक्ट की कुंजी स्ट्रिंग्स हैं, जहां वे किसी मैप के लिए कोई भी मूल्य हो सकते हैं।
  • आप किसी ऑब्जेक्ट के लिए आकार का ट्रैक रखने के दौरान आसानी से मानचित्र का आकार प्राप्त कर सकते हैं।

उदाहरण:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

यदि आप ऐसी चाबियां चाहते हैं, जो अन्य वस्तुओं से संदर्भित नहीं हैं, तो कचरा एकत्र किया जाना चाहिए, एक मानचित्र के बजाय एक WeakMap का उपयोग करने पर विचार करें ।



1
var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

यह ठीक है लेकिन सरणी ऑब्जेक्ट की प्रत्येक संपत्ति के माध्यम से पुनरावृत्त करता है। अगर आप केवल myArray.one, myArray.two गुणों के माध्यम से पुनरावृत्त करना चाहते हैं ... तो आप इस तरह की कोशिश करते हैं

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.push("one");
myArray.push("two");
myArray.push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

अब आप myArray ["एक"] दोनों तक पहुँच सकते हैं और केवल इन गुणों के माध्यम से पुनरावृति कर सकते हैं।


क्या आपने अपने उदाहरण में मिस्टेप्स की गिनती की है? :-) माएरे, भूल गए ')' ...
ब्रायन हाक

उदाहरण के लिए धन्यवाद। हम एकजुट हो सकते हैं Arrayऔर Objectकेवल Objectपेड़ों के साथ काम कर सकते हैं! अद्भुत अंतर्दृष्टि! यह बनाने के लिए बहुत उपयोगी है Object.getOwnPropertyNames(obj/array)!
ब्रायन हाक 12'14

1
var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

}

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