कैसे शब्दकोश बनाने और गतिशील रूप से कुंजी-मूल्य जोड़े जोड़ने के लिए?


323

पोस्ट से:

शब्दकोश <स्ट्रिंग, स्ट्रिंग> के रूप में प्राप्त करने के लिए JSON सरणी भेजना

मैं इस पोस्ट के रूप में एक ही बात करने की कोशिश कर रहा हूँ। एकमात्र मुद्दा यह है कि मुझे नहीं पता कि कुंजी और मूल्य क्या हैं। इसलिए मुझे कुंजी और मूल्य जोड़े को गतिशील रूप से जोड़ने की आवश्यकता है और मुझे नहीं पता कि यह कैसे करना है।

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

मैंने कोशिश की:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

लेकिन वह काम नहीं करता है।


2
यह बहुत अच्छा काम करता है। console.log (वार्स); मुझे दिखाओ [वस्तु कुंजी: "newkey" मूल्य: "newvalue" प्रोटो : ऑब्जेक्ट]
एलेक्स प्लूटौ

सिवाय इसके कि यह एक सूची है, एक शब्दकोश नहीं: \ _ मुझे लगता है कि डेटा को "जोड़े" की सूची के रूप में अच्छी तरह से दर्शाया गया है, जैसे list = [["key1","value1"],["key2","value2"]]। कुछ अन्य भाषाओं में "जोड़ी" या "टपल" प्रकार होता है। वास्तविक तानाशाही जोड़ने के लिए tldr:dict['key'] = "value"
जॉर्डन स्टीवर्ट

जवाबों:


551
var dict = []; // create an empty array

dict.push({
    key:   "keyName",
    value: "the value"
});
// repeat this last part as needed to add more key/value pairs

मूल रूप से, आप 2 गुण (बुलाया keyऔर value) के साथ एक वस्तु शाब्दिक बना रहे हैं और इसे push()सरणी में डाल रहे हैं (उपयोग कर रहे हैं )।


संपादित करें: इसलिए लगभग 5 साल बाद, यह उत्तर नीचे हो रहा है क्योंकि यह "सामान्य" जेएस ऑब्जेक्ट शाब्दिक (उर्फ मानचित्र, उर्फ ​​हैश, उर्फ ​​शब्दकोश) नहीं बना रहा है।
यह है तथापि संरचना का निर्माण है कि ओपी के लिए कहा है (और जो से जुड़े अन्य सवाल में चित्रित किया गया है) है, जो है वस्तु शाब्दिक की एक सरणी , प्रत्येक के साथ keyऔर valueगुण। मुझसे यह न पूछें कि उस संरचना की आवश्यकता क्यों थी, लेकिन यह वही है जो पूछा गया था।

लेकिन, लेकिन, अगर आप एक सादे जेएस ऑब्जेक्ट में चाहते हैं - और संरचना नहीं जिसे ओपी ने पूछा है - टीसीएल का जवाब देखें , हालांकि ब्रैकेट नोटेशन थोड़ा बोझिल है यदि आपके पास बस सरल चाबियाँ हैं जो जेएस के नाम मान्य हैं। आप ऐसा कर सकते हैं:

// object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

या ऑब्जेक्ट बनाने के बाद गुण सेट करने के लिए नियमित डॉट-नोटेशन का उपयोग करें:

// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

आप करते ब्रैकेट अंकन चाहते हैं, तो आप कुंजी है कि ऐसे ही उन में रिक्त स्थान, विशेष वर्ण, या बातें हैं मिल गया है। उदाहरण के लिए:

var dict = {};

// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";

// but this will
dict["some invalid key (for multiple reasons)"] = "value1";

यदि आपकी कुंजियाँ गतिशील हैं, तो आप कोष्ठक संकेतन भी चाहते हैं:

dict[firstName + " " + lastName] = "some value";

ध्यान दें कि कुंजी (संपत्ति के नाम) हमेशा तार होते हैं, और गैर-स्ट्रिंग मान एक कुंजी के रूप में उपयोग किए जाने पर एक स्ट्रिंग के लिए मजबूर हो जाएंगे। जैसे कोई Dateवस्तु अपने स्ट्रिंग प्रतिनिधित्व में परिवर्तित हो जाती है:

dict[new Date] = "today's value";

console.log(dict);
// => {
//      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
//    }

ध्यान दें कि यह "बस काम" जरूरी नहीं है, क्योंकि कई वस्तुओं में एक स्ट्रिंग प्रतिनिधित्व होगा जैसे "[object Object]"कि एक गैर-अद्वितीय कुंजी के लिए नहीं है। तो कुछ इस तरह से सावधान रहें:

var objA = { a: 23 },
    objB = { b: 42 };

dict[objA] = "value for objA";
dict[objB] = "value for objB";

console.log(dict);
// => { "[object Object]": "value for objB" }

बावजूद objAऔर objBकिया जा रहा है पूरी तरह से अलग और अद्वितीय तत्व, वे दोनों एक ही मूल स्ट्रिंग प्रतिनिधित्व: "[object Object]"

इस Dateतरह से व्यवहार नहीं करने का कारण यह है कि Dateप्रोटोटाइप में एक कस्टम toStringतरीका है जो डिफ़ॉल्ट स्ट्रिंग प्रतिनिधित्व को ओवरराइड करता है। और आप भी ऐसा ही कर सकते हैं:

// a simple constructor with a toString prototypal method
function Foo() {
  this.myRandomNumber = Math.random() * 1000 | 0;
}

Foo.prototype.toString = function () {
  return "Foo instance #" + this.myRandomNumber;
};

dict[new Foo] = "some value";

console.log(dict);
// => {
//      "Foo instance #712": "some value"
//    }

(ध्यान दें कि चूंकि ऊपर एक यादृच्छिक संख्या का उपयोग करता है , नाम टक्कर अभी भी बहुत आसानी से हो सकती है। यह सिर्फ एक कार्यान्वयन को चित्रित करने के लिए है toString।)

इसलिए जब वस्तुओं को कुंजी के रूप में उपयोग करने की कोशिश करते हैं, तो जेएस ऑब्जेक्ट के स्वयं के toStringकार्यान्वयन का उपयोग करेगा , यदि कोई हो, या डिफ़ॉल्ट स्ट्रिंग प्रतिनिधित्व का उपयोग करें।


2
क्या वह साहचर्य है?
सेसाबा तोथ

1
@CsabaToth नहीं, dictएक सहयोगी शब्दकोष नहीं है। यह वस्तुओं की एक सरणी है, जिनमें से प्रत्येक दो कुंजी के साथ एक शब्दकोश की तरह एक सा है: "कुंजी" और "मूल्य"।
रोमन स्टार्कोव

1
आपके पास जो कुछ है वह एक सरणी है जिसे केवल 'तानाशाह' नाम दिया गया है।
जन क्यूयू पेबलिक

2
अपडेट की सराहना करें और अतिरिक्त जानकारी का पालन करें।
याकूब

410
var dict = {};

dict['key'] = "testing";

console.log(dict);

अजगर की तरह काम करता है :)

कंसोल आउटपुट:

Object {key: "testing"} 

3
यह निश्चित रूप से एक शब्दकोश बनाने के लिए सबसे अच्छा तरीका है, और सही उत्तर है!
रोमन

3
कोष्ठक के {}बजाय कोष्ठक के साथ आरंभ करने के लिए बहुत महत्वपूर्ण है
जैदर

मैं मूलभूत वस्तुओं का उपयोग इस तरह से शब्दकोशों के रूप में भी करता हूं। खुशी है कि यह सही तरीका है!
TKoL

5
जावास्क्रिप्ट की 'सौंदर्य'! ऑब्जेक्ट आईएस वास्तविक मूल्य का एक प्रमुख जोड़ा है
100r

1
@Azurespot कुंजी कुछ भी धोने योग्य हो सकती है, चाबियाँ हैश द्वारा सभी के बाद ऑर्डर की जाती हैं, जो अजगर 3 में प्रत्येक रन को अलग करती हैं।
Tcll

54

इसके रूप में सरल है:

var blah = {}; // make a new dictionary (empty)

या

var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 

फिर

blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2

1
@KenEucker मुझे लगता है कि इस तरह के प्रश्नों में गलत उत्तर देना उपयोगी है। खासकर अगर कोई समझाता है कि वे गलत क्यों हैं, यह एक अच्छा सीखने का संसाधन है।
CJBrew

32

चूँकि आपने कहा है कि आप एक डिक्शनरी ऑब्जेक्ट चाहते हैं (और ऐसा एरियर नहीं जैसे मैं कुछ समझ पाया) मुझे लगता है कि यह वही है जो आप हैं:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing

एक सरणी में .push का उपयोग करने वाला दूसरा समाधान मेरे उपयोग के लिए काम करता है, लेकिन मुझे लगता है कि अगर मैं इसे आज़माता हूं तो यह भी काम करेगा।
केनेकर

2
जब तक मुझे कोई गलतफहमी न हो कि एक शब्द वस्तु क्या है, तब तक आपका प्रश्न भ्रामक है। आप अपने सरणी से कुंजी द्वारा मान कैसे प्राप्त करेंगे?
ज़ेनमास्टर

मैं इस ऑब्जेक्ट पर JSON.stringify का उपयोग कर रहा हूं और फिर इसे MVC 3 में एक नियंत्रक के साथ पकड़ रहा हूं। यह सिर्फ इतना है कि इसे स्ट्रिंग करने और साथ भेजने से पहले इसे ठीक से स्वरूपित किया गया है।
केनएकर

23

जावास्क्रिप्ट का Object है एक शब्दकोश की तरह अपने आप में। पहिया को सुदृढ़ करने की आवश्यकता नहीं है।

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

बेला



9

मैं इस सवाल को पार करने के लिए कुछ इसी तरह की तलाश में हुआ। इसने मुझे उत्तर पाने के लिए एक परीक्षण चलाने के लिए पर्याप्त जानकारी दी। इसलिए यदि कोई और जानना चाहता है कि जावास्क्रिप्ट ऑब्जेक्ट में एक {key: 'value'} जोड़ी को गतिशील रूप से कैसे जोड़ा या देखा जा सकता है, तो यह परीक्षण आपको वह सब बता देना चाहिए जो आपको जानना चाहिए।

var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 =  'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';

console.log(dictionary[keyInitial]);

dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);

उत्पादन

initialValue
{ initialkey: 'initialValue',
  something: 'value1',
  somethingElse: 'value2' }

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

1
धन्यवाद @SalmonKiller मैं अपने स्वयं के प्रश्न को लिखने के लिए उचित शब्दावली के बारे में अनिश्चित था और यह समझने की अपेक्षा करता था, लेकिन फिर मैंने अपनी खोज में यह सब जानकारी के साथ हुआ, लेकिन कई उत्तरों के बीच फैल गया, इसलिए मैंने इस प्रश्न की अवधारणा का उत्तर दिया जिस तरह से किसी और के लिए इसका जवाब होगा जो इस सवाल पर ठोकर खा गया, जो मुझे उसी चीज की तलाश में है
user2301449

1
जबरदस्त हंसी। मैं इसकी समीक्षा कर रहा था और यह एक उत्तर के बजाय एक प्रश्न की तरह लग रहा था। दुखी आदमी!
साल्मनकिलर

इसे जोड़ने के लिए धन्यवाद। आप इसे ऊपर दिए गए उत्तर की तरह एक बेला में भी डाल सकते हैं।
केनयुकर

8
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1

कुछ अतिरिक्त प्रदर्शन के लिए, आपको key1 = dictionary.key1सूचकांक के बजाय संदर्भ लेना चाहिएkey1 = dictionary["key1"]
Tcll

4

आप एक वर्ग शब्दकोश बना सकते हैं ताकि आप आसानी से शब्दकोश सूची के साथ बातचीत कर सकें:

class Dictionary {
  constructor() {
    this.items = {};
  }
  has(key) {
    return key in this.items;
  }
  set(key,value) {
    this.items[key] = value;
  }
  delete(key) {
    if( this.has(key) ){
      delete this.items[key]
      return true;
    }
    return false;
  }
}

var d = new Dictionary();
d.set(1, "value1")
d.set(2, "value2")
d.set(3, "value3")
console.log(d.has(2));
d.delete(2);
console.log(d.has(2));


3

कैसे एक महत्वपूर्ण मूल्य जोड़ी बनाने के लिए एक लाइनर के बारे में?

let result = { ["foo"]: "some value" };

और कुछ पुनरावृत्ति फ़ंक्शन reduceगतिशील रूप से एक शब्दकोश में कनवर्ट करने के लिए पसंद करते हैं

var options = [
  { key: "foo", value: 1 },
  { key: "bar", value: {id: 2, name: "two"} },
  { key: "baz", value: {["active"]: true} },
];

var result = options.reduce((accumulator, current) => {
  accumulator[current.key] = current.value;
  return accumulator;
}, {});

console.log(result);


3

आधुनिक जावास्क्रिप्ट (ES6 / ES2015) में, किसी को शब्दकोश के लिए मैप डेटा संरचना का उपयोग करना चाहिए। ईएस 6 में मैप डेटा संरचना आपको कुंजी के रूप में मनमाने मूल्यों का उपयोग करने देता है।

const map = new Map();
map.set("true", 1);
map.set("false", 0);

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

var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;

एक प्रोटोटाइप ऑब्जेक्ट के बिना एक शब्दकोश बनाने के कई फायदे हैं। नीचे ब्लॉग इस विषय पर पढ़ने लायक हैं।

dict पैटर्न

वस्तुओं के रूप में नक्शे


2

यह जानने में एक टन की मदद करेगा कि आपका अंतिम वांछित परिणाम क्या है, लेकिन मुझे लगता है कि यह वही है जो आप चाहते हैं:

var vars = [{key:"key", value:"value"}];

vars.push({key: "newkey", value: "newvalue"})

2

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

  // example dict/json                  
  var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
    'record_identifier_2': {'content':'Some  different content','title':'Title of my another Record'} };

  var array = [];

  // key to reduce the 'record' to
  var reduceKey = 'title';

  for(key in iterateDict)
   // ultra-safe variable checking...
   if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
    // build element to new array key
     array[key]=iterateDict[key][reduceKey];

1

पर एक सुधार var dict = {}का उपयोग करना है var dict = Object.create(null)

यह एक खाली वस्तु है कि पैदा करेगा नहीं है Object.prototypeयह प्रोटोटाइप के रूप में।

var dict1 = {};
if (dict1["toString"]){
    console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
    console.log("This line won't run :)")
}

1

पहली शुरुआत Array ग्लोबली

var dict = []

शब्दकोश में ऑब्जेक्ट जोड़ें

dict.push(
     { key: "One",value: false},
     { key: "Two",value: false},
     { key: "Three",value: false});

Output : 
   [0: {key: "One", value: false}
    1: {key: "Two", value: false}
    2: {key: "Three", value: false}]

शब्दकोश से अद्यतन वस्तु

Object.keys(dict).map((index) => {        
  if (index == 1){
    dict[index].value = true
  }
});

Output : 
   [0: {key: "One", value: false},
    1: {key: "Two", value: true},
    2: {key: "Three", value: false}]

शब्दकोश से ऑब्जेक्ट हटाएं

Object.keys(dict).map((index) => {              
      if (index == 2){
        dict.splice(index)
      }
    });

Output : 
    [0: {key: "One", value: false},
     1: {key: "Two", value: true}]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.