जावास्क्रिप्ट में एक साहचर्य सरणी में एक कुंजी के रूप में पूर्णांक का उपयोग करना


102

जब मैं एक नया जावास्क्रिप्ट सरणी बनाता हूं, और एक पूर्णांक को एक कुंजी के रूप में उपयोग करता हूं, तो उस सरणी के प्रत्येक तत्व को अपरिभाषित के रूप में बनाया जाता है।

उदाहरण के लिए:

var test = new Array();
test[2300] = 'Some string';
console.log(test);

2298 अपरिभाषित और एक 'कुछ स्ट्रिंग' का उत्पादन करेगा।

मुझे एक पूर्णांक के बजाय स्ट्रिंग के रूप में 2300 का उपयोग करने के लिए जावास्क्रिप्ट कैसे प्राप्त करना चाहिए, या मुझे इसे 2299 रिक्त स्थानों को तत्काल बनाने से कैसे रोकना चाहिए?

जवाबों:


128

एक वस्तु का उपयोग करें, जैसा कि लोग कह रहे हैं। हालाँकि, ध्यान दें कि आपके पास पूर्णांक कुंजियाँ नहीं हो सकती हैं । जावास्क्रिप्ट पूर्णांक को एक स्ट्रिंग में बदल देगा । निम्न आउटपुट 20, अपरिभाषित नहीं:

var test = {}
test[2300] = 20;
console.log(test["2300"]);

12
+1 ध्यान दें कि यह Arrays का भी सच है! देखें stackoverflow.com/questions/1450957/…
bobince

1
@ बॉब: आंतरिक, निश्चित रूप से। हालाँकि, तार्किक रूप से , सरणियों में पूर्णांक "कुंजियाँ" होती हैं।
को ऑर्बिट

1
कृपया ध्यान दें, कि पूर्णांक को कुंजी के रूप में उपयोग करने से आपके सरणी की लंबाई बदल जाएगी। आपको इसके बजाय निश्चित रूप से ऑब्जेक्ट का उपयोग करना चाहिए। मैं सिर्फ कुंजी के रूप में facebook आईडी का उपयोग करना चाहता था, और JSON.stringify मेरी मशीन को क्रैश कर देगा;)
क्रिस्टियन

2
@LightnessRacesinOrbit आंतरिक विवरण अभी भी लीक हो सकता है और आपको काट सकता है। आज जो मैं भाग गया, उसका यह सरलीकृत संस्करण देखें: jsfiddle.net/cincodenada/pseujLex/2 यह कम होने पर वंचित लग सकता है, लेकिन एक बड़ी स्क्रिप्ट का एक कामुक हिस्सा था (और कॉफीस्क्रिप्ट में थोड़ा कम वंचित है: jsfiddle.net/ cincodenada / oojr7Ltn / 2 )। यह कार्यान्वयन विस्तार मुझे आज बग-शिकार का एक अच्छा सा खर्च लगता है।
सिनकोडेनडा

1
गैर-संपूर्ण संख्याओं के लिए थोड़ा ध्यान दें: 0.25और .25एक ही स्ट्रिंग पर हल करें "0.25"। तो अगर आप आंशिक कुंजियों का उपयोग कर रहे हैं, यदि आप एक संख्यानुसार सेट कुंजी की संपत्ति प्राप्त कर सकते हैं 0.25का उपयोग कर 0.25, .25, "0.25"लेकिन नहीं ".25"
सैंडी जिफर्ड

34

आप बस एक वस्तु का उपयोग कर सकते हैं:

var test = {}
test[2300] = 'Some string';

16
अभी भी तार-तार हो जाता है।
drew010

1
@ drew010 हां, जावास्क्रिप्ट की वस्तुएं केवल तारों के साथ अनुक्रमण की अनुमति देती हैं।
पिथिकोस

22

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

आप अपनी वस्तु बना सकते हैं:

var object = {};

और मानों को जोड़िए जैसे कि सरणी काम करता है:

object[1] = value;
object[2] = value;

यह आपको देगा:

{
  '1': value,
  '2': value
}

उसके बाद आप इसे कुंजी की तरह अन्य भाषाओं में एक्सेस कर सकते हैं:

for(key in object)
{
   value = object[key] ;
}

मैंने परीक्षण किया है और काम करता है।


17

यदि उपयोग मामला संग्रह में डेटा संग्रहीत कर रहा है तो ECMAScript 6Map प्रकार प्रदान करता है ।

इसे शुरू करना केवल भारी है।

यहाँ एक उदाहरण है:

const map = new Map();
map.set(1, "One");
map.set(2, "Two");
map.set(3, "Three");

console.log("=== With Map ===");

for (const [key, value] of map) {
    console.log(`${key}: ${value} (${typeof(key)})`);
}

console.log("=== With Object ===");

const fakeMap = {
    1: "One",
    2: "Two",
    3: "Three"
};

for (const key in fakeMap) {
    console.log(`${key}: ${fakeMap[key]} (${typeof(key)})`);
}

परिणाम:

=== With Map ===
1: One (number)
2: Two (number)
3: Three (number)
=== With Object ===
1: One (string)
2: Two (string)
3: Three (string)

11

अन्य उत्तरों का संकलन:

वस्तु

var test = {};

किसी संख्या को नई संपत्ति की कुंजी के रूप में उपयोग करते समय, संख्या एक स्ट्रिंग में बदल जाती है:

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'

एक ही नंबर का उपयोग करके संपत्ति के मूल्य को एक्सेस करते समय, संख्या को फिर से एक स्ट्रिंग में बदल दिया जाता है:

console.log(test[2300]);
// Output: 'Some string'

जब ऑब्जेक्ट से चाबी मिल रही है, हालांकि, वे संख्याओं में वापस जाने वाले नहीं हैं:

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'

नक्शा

ECMAScript 6 मैप ऑब्जेक्ट ( प्रलेखन , ऑब्जेक्ट के साथ तुलना ) के उपयोग की अनुमति देता है । यदि आपका कोड स्थानीय रूप से व्याख्या करने के लिए है या ECMAScript 6 संगतता तालिका आपके उद्देश्यों के लिए पर्याप्त हरी दिखती है, तो मानचित्र का उपयोग करने पर विचार करें:

var test = new Map();
test.set(2300, 'Some string');
console.log(test.get(2300));
// Output: 'Some string'

किसी भी प्रकार का रूपांतरण बेहतर और बदतर के लिए नहीं किया जाता है:

console.log(test.get('2300'));
// Output: undefined
test.set('2300', 'Very different string');
console.log(test.get(2300));
// Output: 'Some string'

4

किसी सरणी के बजाय किसी ऑब्जेक्ट का उपयोग करें। JavaScript में Arrays सहयोगी सरणियाँ नहीं हैं। वे किसी भी गुण से जुड़े जादू के साथ वस्तुएं हैं जिनके नाम पूर्णांक की तरह दिखते हैं। यदि आप उन्हें पारंपरिक सरणी जैसी संरचना के रूप में उपयोग नहीं कर रहे हैं तो वह जादू नहीं है।

var test = {};
test[2300] = 'some string';
console.log(test);

1
वे साहचर्य सरणियां हो सकती हैं, लेकिन केवल इसलिए कि वे ऐसी वस्तुएं भी हैं जिनके नाम सेट गुण हो सकते हैं। लेकिन यह सिर्फ चीजों को हास्यास्पद रूप से भ्रमित करता है, और हां, वस्तुओं का उपयोग करने के लिए बहुत बेहतर है।
ग्रेजा

ऐरे कभी सहयोगी नहीं हो सकता। यदि आप किसी सरणी में कुंजियों का उपयोग करने का प्रयास करते हैं और फिर उन पर पुनरावृति करते हैं, तो आप देखेंगे कि आप सभी डिफ़ॉल्ट तरीकों और सरणियों के गुणों के माध्यम से भी पुनरावृत्ति कर रहे हैं -> बहुत वांछनीय नहीं है।
स्विजेक टेलर

@Swizec - वास्तव में मैंने क्यों कहा "हास्यास्पद रूप से भ्रमित"। आप एक सरणी को साहचर्य सरणी के रूप में उपयोग कर सकते हैं - जो कि नाम / मान जोड़े के रूप में है, लेकिन आप कभी भी उन्हें पुनरावृत्त नहीं करना चाहेंगे! (मैं बस एक तकनीकीता की ओर इशारा कर रहा था, निश्चित रूप से ऐसा कुछ नहीं जो मैं करने की सलाह
दूंगा

हां, लेकिन जब वे किसी विशेष क्रम में नहीं हैं (अर्थात आदेश की गारंटी नहीं है), जो उन्हें क्रमांकित करने की बात होगी, तो यह सिर्फ भ्रमित करने की तुलना में बहुत खराब है।
जूलिक्स

3

एक वस्तु का उपयोग करने की कोशिश करें, न कि एक सरणी:

var test = new Object(); test[2300] = 'Some string';

3
यह निश्चित रूप से जाने का रास्ता है। इस तरह आप एक स्ट्रिंग को स्टोर करने के लिए 2300 प्रविष्टियाँ लंबे अरेंजमेंट नहीं बनाएंगे।
क्रिस्टियन

2
@ क्रिस्टियन जेएस सरणियाँ नकली सरणियाँ हैं। भागो var a = []; a[Math.pow(2, 30)] = 'hello';और आपको एक गीगाबाइट से अधिक ब्राउज़र / मेमोरी उपयोग नहीं दिखाई देगा, लेकिन आप a.length1073741824 देखेंगे। वीएम स्पष्ट रूप से कुछ अन्य डेटा संरचना का उपयोग करके कुछ "सरणियों" को स्टोर करते हैं, मुझे लगता है कि बस एक हैशटेबल है, कम से कम अगर वे पर्याप्त रूप से विरल हैं।
एंडी

2

जब एक संपत्ति का नाम पूर्णांक होता है, तो एक साहचर्य सरणी संपत्ति के लिए मूल्य प्राप्त करें:

एक साहचर्य सरणी से शुरू होता है जहां संपत्ति के नाम पूर्णांक होते हैं:

var categories = [
    {"1": "Category 1"},
    {"2": "Category 2"},
    {"3": "Category 3"},
    {"4": "Category 4"}
];

सरणी में आइटम पुश करें:

categories.push({"2300": "Category 2300"});
categories.push({"2301": "Category 2301"});

सरणी के माध्यम से लूप करें और संपत्ति के मूल्य के साथ कुछ करें।

for (var i = 0; i < categories.length; i++) {
    for (var categoryid in categories[i]) {
        var category = categories[i][categoryid];
        // Log progress to the console
        console.log(categoryid + ": " + category);
        //  ... do something
    }
}

कंसोल आउटपुट इस तरह दिखना चाहिए:

1: Category 1
2: Category 2
3: Category 3
4: Category 4
2300: Category 2300
2301: Category 2301

जैसा कि आप देख सकते हैं, आप सहयोगी सरणी सीमा के आसपास प्राप्त कर सकते हैं और एक संपत्ति का नाम पूर्णांक हो सकता है।

नोट: मेरे उदाहरण में साहचर्य सरणी JSON सामग्री है यदि आप एक शब्दकोश <string>, string> [] ऑब्जेक्ट को क्रमबद्ध करते हैं।


0

किसी ऑब्जेक्ट का उपयोग करें - एक पूर्णांक के साथ कुंजी के रूप में - एक सरणी के बजाय।


0

कभी-कभी मैं अपनी चाबी के लिए एक उपसर्ग का उपयोग करता हूं। उदाहरण के लिए:

var pre = 'foo',
    key = pre + 1234

obj = {};

obj[key] = val;

अब आपको उन्हें एक्सेस करने में कोई समस्या नहीं है।

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