सवाल जावास्क्रिप्ट - अपरिभाषित की संपत्ति सेट नहीं कर सकता है


मेरा कोड:

    var a = "1",
        b = "hello",
        c = { "100" : "some important data" },
        d = {};

        d[a]["greeting"] = b;
        d[a]["data"] = c;

        console.debug (d);

मुझे निम्नलिखित त्रुटि मिलती है:

Uncaught TypeError: अपरिभाषित की संपत्ति 'ग्रीटिंग' सेट नहीं कर सकता।

मैं एक एसोसिएटिव सरणी के समान कुछ करने की कोशिश कर रहा हूं। यह क्यों काम नहीं कर रहा है?


76
2017-09-20 02:44


मूल


डी [ए] अपरिभाषित है। संक्षेप में डी ["1"] अपरिभाषित है - Joseph Marikle


जवाब:


आपने कभी सेट नहीं किया d[a] किसी भी मूल्य के लिए।

होने के कारण, d[a] का मूल्यांकन undefined, और आप गुणों को सेट नहीं कर सकते हैं undefined

यदि आप जोड़ते हैं d[a] = {} एकदम बाद d = {} चीजों को उम्मीद के रूप में काम करना चाहिए।

वैकल्पिक रूप से, आप ऑब्जेक्ट प्रारंभकर्ता का उपयोग कर सकते हैं:

d[a] = {
    greetings: b,
    data: c
};

या आप सभी संपत्तियों को सेट कर सकते हैं d एक अनाम समारोह उदाहरण में:

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

यदि आप ऐसे वातावरण में हैं जो ES2015 सुविधाओं का समर्थन करता है, तो आप इसका उपयोग कर सकते हैं गणना संपत्ति नाम:

d = {
  [a]: {
    greetings: b,
    data: c
  }
};

108
2017-09-20 02:45



यह काम करता है। पैटर्न होना चाहिए: डी = {[ए]: {बधाई: बी, डेटा: सी}} - robskrob
@robertjewell, अच्छा बिंदु, मैंने ES2015 नोटेशन के बारे में नोट शामिल करने के लिए अद्यतन किया है। - zzzzBov


आपको सेट करना है d[a] या तो एक सहयोगी सरणी, या एक वस्तु के लिए:

  • d[a] = [];
  • d[a] = {};

सेटिंग के बिना, यह हो रहा है:

d[a] == undefined, तो आप कर रहे हैं undefined['greeting']=b; और परिभाषा के अनुसार, अपरिभाषित कोई गुण नहीं है। इस प्रकार, आपको मिली त्रुटि।


24
2017-09-20 02:51



array या object। जेएस के पास सहयोगी सरणी नहीं है, हालांकि Object सीमित उपयोग के लिए एक की तरह कार्य कर सकते हैं। - Jeremy J Starcher
@ जेरेमी जेस्टारचर: बिल्कुल सही और जानना महत्वपूर्ण है, लेकिन सोच के उस स्तर से, जावास्क्रिप्ट में कोई सरणी नहीं है; इसमें केवल वस्तुएं हैं - vol7ron
बिल्कुल नहीं। सहयोगी सरणी के पहलू हैं जो जवाक्रिप्ट वस्तुओं के बारे में सच नहीं हैं जो कोडर को यात्रा कर सकते हैं। (सच्चे सहयोगी सरणी तारों की कुंजी की आवश्यकता के अनुसार सीमित नहीं हैं। विरासत पूर्वनिर्धारित गुणों की उपस्थिति एक और बड़ा अंतर है।) दूसरी तरफ, जावास्क्रिप्ट सरणी, जबकि ऑब्जेक्ट्स, एक कार्य करते हैं, एक संख्यात्मक सरणी व्यवहार करने की अपेक्षा करता है। एक कार्यक्षमता का एक पहलू है, जबकि दूसरा आंतरिक कार्यान्वयन है। - Jeremy J Starcher


ऑब्जेक्ट पर संग्रहीत d[a] कुछ भी सेट नहीं किया गया है। इस प्रकार, d[a] का मूल्यांकन undefined। आप एक संपत्ति असाइन नहीं कर सकते हैं undefined :)। आपको ऑब्जेक्ट या सरणी असाइन करने की आवश्यकता है d[a]:

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);

5
2017-09-20 02:47



ऑब्जेक्ट असाइन करने के लिए सर्वश्रेष्ठ: d[a] = {}; - गैर-न्यूमेरिक कुंजियों वाले सरणी का उपयोग लाइन के नीचे की समस्याओं का कारण बनता है। - nnnnnn


जावास्क्रिप्ट में लगभग सबकुछ एक वस्तु है, null तथा undefined अपवाद हैं

के उदाहरण Array एक वस्तु है इसलिए आप एक ही कारण के लिए एक सरणी की संपत्ति सेट कर सकते हैं, क्योंकि आप अपरिभाषित की संपत्ति सेट नहीं कर सकते हैं, क्योंकि इसकी नहीं एक वस्तु


4
2017-09-20 03:40





मैं सिर्फ यह देखने के लिए एक सरल जांच करता हूं कि क्या डी [ए] मौजूद है और यदि इसे प्रारंभ नहीं किया गया है ...

var a = "1",
    b = "hello",
    c = { "100" : "some important data" },
    d = {};

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);

0
2018-03-31 21:19