टाइपस्क्रिप्ट, एक शब्दकोश के माध्यम से लूपिंग


184

मेरे कोड में, मेरे पास कुछ शब्दकोशों हैं (जैसा कि यहाँ सुझाव दिया गया है ) जो स्ट्रिंग अनुक्रमित है। यह थोड़ा सुधारित प्रकार का होने के कारण, मैं सोच रहा था कि क्या कोई सुझाव है कि मैं प्रत्येक कुंजी (या मूल्य, सभी के लिए वैसे भी कुंजी की आवश्यकता है) के माध्यम से कैसे लूप कर पाऊंगा। किसी भी मदद की सराहना की!

myDictionary: { [index: string]: any; } = {};

क्या आपने कोशिश की for (var key in myDictionary) { }:? लूप के अंदर, आप keyकुंजी प्राप्त करने के लिए उपयोग करेंगे, और myDictionary[key]मान पाने के लिए
इयान

@ इयान ने कोशिश की है कि, काम नहीं कर रहा है। कोई त्रुटि नहीं है, लेकिन बयान के भीतर कुछ भी नहीं चलता है
ben657

1
@ हाँ, क्षमा करें, कहीं और कुछ कोड इसके साथ खिलवाड़ कर रहा था। यह पूरी तरह से काम करता है! यह एक जवाब बनाने के लिए देखभाल तो मैं इसे चुन सकते हैं?
६६५

जवाबों:


294

कुंजी / मूल्यों पर लूप करने के लिए, एक for inलूप का उपयोग करें :

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

8
यह सामान्य रूप से सुरक्षित नहीं है; इसे hasOwnProperty टेस्ट की जरूरत है (जैसा कि जेमी स्टार्क के जवाब में) या कुछ और।
डॉन हैच

20
@ डोनचैच यह वास्तव में सामान्य रूप से बहुत सुरक्षित है। यह बहुत विशिष्ट मामलों में सुरक्षित नहीं है (जैसे कि जब आप पुस्तकालय शामिल करते हैं जो प्रोटोटाइप को गलत तरीके से संशोधित करते हैं, या जानबूझकर प्रोटोटाइप को गलत तरीके से संशोधित करते हैं)। यह डेवलपर के ऊपर है कि क्या उनके कोड को सबसे अधिक संभावना-अनावश्यक चेक के साथ ब्लोट किया जाए
Ian

1
@ इयान - मेरी सोच यह है कि मैं अतिरिक्त सुरक्षा उपायों के बिना इसका उपयोग नहीं करूंगा क्योंकि ऐसा लगता है जैसे कोई दुर्घटना होने की प्रतीक्षा कर रहा है, उदाहरण के लिए यदि कोड एक उपयोगिता फ़ंक्शन में अपना रास्ता ढूंढता है, और फिर कोई व्यक्ति उस फ़ंक्शन को पास करता है जो केवल एक नहीं है ऑब्जेक्ट, बल्कि अतिरिक्त गुणों के साथ कुछ। हां, जैसा कि आप कहते हैं, इस तरह के परिदृश्य की संभावना और गंभीरता को तौलना डेवलपर के लिए है। खुद के लिए, कम से कम मानसिक रूप से बोझिल दृष्टिकोण का व्यवहार करना है, हालांकि इस तरह के परिदृश्य को सभी मामलों में होने की गारंटी है - सोचने के लिए कम।
डॉन हैच

5
@ समस्या यह है कि बहुत सारे पुस्तकालय हैं जो ऑब्जेक्ट प्रोटोटाइप को संशोधित करते हैं। इस तरह के पैटर्न की वकालत करना एक बुरा विचार है जब बहुत बेहतर सरल विकल्प मौजूद हैं, जैसे कि Object.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });। यदि आपको यह तरीका दिखाना है, तो कम से कम उन जोखिमों और बेहतर विकल्पों का उल्लेख करें जो अभी तक बेहतर नहीं जानते हैं।
योना एप्लेट्री

8
हमारे पास पहले से ही es6 और टाइपस्क्रिप्ट हैं। हर समय लिखने की समस्या क्यों है OOnProperty अनसुलझे हैं? 2017 में भी और जेएस पर सभी ध्यान देने के साथ। मैं बहुत निराश हूं।
घुमारवीं

169

<ES 2017 :

Object.keys(obj).forEach(key => {
  let value = obj[key];
});

> = ईएस 2017 :

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value);
);

यह वह समाधान है जिसकी मैं तलाश कर रहा था क्योंकि यह मुझे पुनरावृत्ति से पहले कुंजियों को क्रमबद्ध करने की अनुमति देगा
एंड्रयू

FYI करें, यह इस समय टाइपस्क्रिप्ट खेल के मैदान पर समर्थित नहीं है।
सीनियनी १२

1
टाइपस्क्रिप्ट में काम करने का तरीका यहाँ देखेंObject.entries
एलेक्स

यह एकदम सही है
पीयूष चौधरी

66

इस बारे में कैसा है?

for (let [key, value] of Object.entries(obj)) {
    ...
}

1
इसे tsconfig में lib es2017 की आवश्यकता है। देखें stackoverflow.com/questions/45422573/...
स्टीफन

यह वही है जो मुझे obj पर टाइपस्क्रिप्ट त्रुटि [कुंजी] "कोई सूचकांक हस्ताक्षर ..." प्राप्त करने के लिए आवश्यक था क्योंकि मैंने स्पष्ट रूप से अपने obj प्रकार को {[कुंजी: स्ट्रिंग]: स्ट्रिंग} के रूप में सेट किया था और {{कुंजी: का उपयोग नहीं करना चाहता था। string]: कोई}। इससे मैं सिर्फ 'मूल्य' तक पहुंच सकता हूं। धन्यवाद
ggedde

और अगर आप इसे अनदेखा करना चाहते हैं key, तो बस इसे खाली छोड़ दें [ , value]:। ( इस मुद्दे पर टिप्पणी के लिए धन्यवाद ।)
डोमिनिक

50

इयान द्वारा उल्लेखित कुंजी / मूल्य लूप के लिए एक चेतावनी है। यदि यह संभव है कि ऑब्जेक्ट में उनके प्रोटोटाइप से जुड़ी विशेषताएँ हो सकती हैं, और जब आप inऑपरेटर का उपयोग करते हैं , तो ये विशेषताएँ शामिल होंगी। इसलिए आप यह सुनिश्चित करना चाहेंगे कि कुंजी आपके उदाहरण की विशेषता है, न कि प्रोटोटाइप की। पुराने IE indexof(v)को एक कुंजी के रूप में दिखाने के लिए जाना जाता है ।

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

2
बालों को विभाजित करने की कोशिश नहीं कर रहा है, लेकिन जब से हम टाइप स्क्रिप्ट की बात कर रहे हैं, तो क्या आपको var key के बजाय key का उपयोग नहीं करना चाहिए? अच्छा जवाब धन्यवाद।
ल्यूक डुपिन

3
वास्तव में, प्रकार स्क्रिप्ट के वर्तमान संस्करण के साथ keyऔर valueहो सकता है const
पैट्रिक डेसजार्डिंस

hasOwnPropertyचेक को लक्ष्य ऑब्जेक्ट से कॉल नहीं करना बेहतर है , इसके बजाय ऐसा करें: ...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...एल्स, यदि आप no-prototype-builtinsनियम के साथ एस्लिंट का उपयोग कर रहे हैं, तो यह एक त्रुटि का उत्सर्जन करेगा।
sceee

5

सभी शब्दकोश / वस्तु मान प्राप्त करने का सबसे छोटा तरीका:

Object.keys(dict).map(k => dict[k]);

0

चाबी पाने के लिए:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

0

इयान उत्तर अच्छा है, लेकिन आपको कुंजी के लिए जाने के बजाय कास्ट का उपयोग करना चाहिए क्योंकि यह कभी भी अपडेट नहीं होता है।

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.