क्या ऑब्जेक्ट कुंजी के रूप में संख्यात्मक प्रकार का उपयोग करने का कोई तरीका है?


97

ऐसा लगता है कि जब मैं किसी ऑब्जेक्ट में एक संख्यात्मक नाम के रूप में एक संख्यात्मक प्रकार का उपयोग करता हूं, तो यह हमेशा एक स्ट्रिंग में परिवर्तित हो जाता है। क्या वास्तव में इसे एक संख्यात्मक के रूप में संग्रहीत करने के लिए प्राप्त करना है? सामान्य टाइपकास्टिंग काम नहीं करता है।

उदाहरण:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

डिर आउटपुट:

{
    '1': 'a value'
}

क्या मैं चाहता हूँ यह है:

{
    1: 'a value'
}

सलाह?


इस टिप्पणी को भी देखें - stackoverflow.com/questions/3633362/…
मनोहर रेड्डी ने 27

जवाबों:


109

नहीं, यह संभव नहीं है। कुंजी हमेशा एक स्ट्रिंग में बदल जाएगी। संपत्ति एक्सेसर डॉक्स देखें

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

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'

1
यह बल्कि व्यक्तिपरक है। जैसा कि विलियम ने कहा, पूर्णांक कुंजियों के लिए आप इसके बजाय एक सरणी का उपयोग कर सकते हैं। अधिकांश JS इंजन पर्दे के पीछे विरल सरणियों का उपयोग कर सकते हैं।
मैथ्यू फ्लशेन

7
यहां तक ​​कि एक सरणी में, सभी संपत्ति के नाम तार में बदल जाते हैं।
टिम डाउन

2
@ Roamer-1888: नहीं, यह नहीं है। एकमात्र अंतर यह है कि किसी संख्यात्मक संपत्ति को सरणी में निर्दिष्ट करने से सरणी की lengthसंपत्ति प्रभावित होती है ।
टिम डाउन

2
@TimDown, और जो मैं कह रहा हूं वह गलत है। "ऐरे पर एक संख्यात्मक संपत्ति सेट करना लंबाई की संपत्ति को प्रभावित कर सकता है" एक गलत कथन है। जावास्क्रिप्ट ऐरे गुण ऐरे तत्वों से पूरी तरह से स्वतंत्र हैं। लोगों को क्या भ्रमित करता है कि साहचर्य वाक्यविन्यास, उदाहरण के लिए myArray["1"] = foo, एक संपत्ति की स्थापना करता प्रतीत होता है, जबकि यह वास्तव में एक सरणी तत्व निर्धारित करता है, लेकिन केवल इसलिए कि "1" पूर्णांक का एक स्ट्रिंग प्रतिनिधित्व है, जो पूर्ण भाषाई बकवास है - लेकिन यह जावास्क्रिप्ट है।
रोमर -1888

4
@ Roamer-1888: "जावास्क्रिप्ट ऐरे गुण अर्रे तत्वों से पूरी तरह से स्वतंत्र हैं" एक गलत बयान है। myArray["1"] = fooकेवल एक संपत्ति सेट करना प्रतीत नहीं होता है, यह वास्तव में संपत्ति की परिभाषा के हर मायने में एक संपत्ति (एक कुंजी "1" के साथ) सेट है। जैसे, myArray.hasOwnProperty("1")पैदावार true। शब्दार्थ, इस संपत्ति को एक संख्यात्मक कुंजी होने के कारण "तत्व" भी माना जा सकता है, लेकिन आगे कुछ भी नहीं है जो एक सरणी संपत्ति से एक सरणी "तत्व" को अलग करता है। युक्ति पढ़ें। यदि आप अभी भी असहमत हैं, तो कृपया अपने स्रोत का हवाला दें।
हंस

23

एक ऑब्जेक्ट में, नहीं, लेकिन मैंने इस एप्लिकेशन के लिए मैप को बहुत उपयोगी पाया है । यहाँ पर मैंने इसका उपयोग संख्यात्मक कुंजियों के लिए किया है, जो कि एक कुंजी आधारित घटना है।

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}

1
सुरुचिपूर्ण लड्डुमारे प्रविष्टियों की 101 ! +1
केसर

11

ECMA-262-5 में डिजाइन द्वारा होने की अपील करता है:

प्रॉपर्टी आइडेंटिफ़ायर टाइप का इस्तेमाल प्रॉपर्टी डिस्क्रिप्टर के साथ प्रॉपर्टी के नाम को जोड़ने के लिए किया जाता है। प्रॉपर्टी आइडेंटिफ़ायर टाइप के वैल्यूज़ फॉर्म (नाम, डिस्क्रिप्टर) के जोड़े होते हैं, जहाँ नाम एक स्ट्रिंग है और डिस्क्रिप्टर एक प्रॉपर्टी डिस्क्रिप्टर वैल्यू है।

हालाँकि, मुझे ECMA-262-3 में इसके लिए एक निश्चित विनिर्देश नहीं दिख रहा है। भले ही, मैं संपत्ति के नाम के रूप में गैर-स्ट्रिंग का उपयोग करने का प्रयास नहीं करूंगा।


2

क्या हमें ऐसा कुछ चाहिए?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

कंसोल: ऑब्जेक्ट

1: "एक मान"


0

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

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

यह तभी काम करता है जब कुंजी और संख्यात्मक चरित्र के साथ शुरू नहीं होता है अन्यथा इसे एक नंबर में बदल दिया जाएगा। निम्न उदाहरण देखें:

parseInt("45kjghk") === 45

मैंने यहाँ jQuery का उपयोग किया


अपडेट किया गया:

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

यह उपरोक्त समस्या को दूर कर सकता है। यदि उपलब्ध हो तो कृपया बेहतर सुझाव दें और यदि हो तो इस उत्तर के साथ समस्या करें।


-3

जावास्क्रिप्ट में, संख्यात्मक तार और संख्या विनिमेय हैं, इसलिए

myObject[1] == myObject['1']

क्या तुम सच में नंबर एक वस्तु के लिए महत्वपूर्ण होने के लिए चाहते हैं, तो आप एक सरणी (यानी के साथ बनाया चाहते हो सकता है new Array()या [])।


2
प्रतिक्रिया के लिए धन्यवाद, लेकिन यह पूरी तरह से सही नहीं है। एक संख्यात्मक केवल टाइपोफ़ से 'संख्या' के रूप में वापस आएगा, और इसके विपरीत एक स्ट्रिंग के साथ।
स्पॉट

@william 'संख्यात्मक तार और संख्या विनिमेय हैं' बस सही नहीं है। नंबर नंबर हैं और स्ट्रिंग्स स्ट्रिंग्स हैं। देखें Object.prototype.toString.call(someObject)समस्या यह है कि आप संख्याओं को कुंजियों के रूप में उपयोग नहीं कर सकते।
मिकमेकाना 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.