सूचकांक / कुंजी के साथ… के लिए टाइपस्क्रिप्ट?


146

जैसा कि यहां बताया गया है टाइप टाइपस्क्रिप्ट एक फॉरेक्स लूप पेश करता है:

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item); // 9,2,5
}

लेकिन क्या कोई सूचकांक / कुंजी नहीं है? मैं कुछ इस तरह की उम्मीद करेंगे:

for (var item, key of someArray) { ... }

जवाबों:


274

.forEach पहले से ही यह क्षमता है:

const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
});

लेकिन अगर आप की क्षमता चाहते हैं for...of, तो आप mapसूचकांक और मूल्य के लिए सरणी कर सकते हैं :

for (const { index, value } of someArray.map((value, index) => ({ index, value }))) {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
}

यह थोड़ा लंबा है, इसलिए इसे पुन: प्रयोज्य कार्य में लगाने में मदद मिल सकती है:

function toEntries<T>(a: T[]) {
    return a.map((value, index) => [index, value] as const);
}

for (const [index, value] of toEntries(someArray)) {
    // ..etc..
}

Iterable संस्करण

यदि आप --downlevelIterationसंकलक विकल्प के साथ संकलन करते हैं तो ES3 या ES5 को लक्षित करते समय यह काम करेगा ।

function* toEntries<T>(values: T[] | IterableIterator<T>) {
    let index = 0;
    for (const value of values) {
        yield [index, value] as const;
        index++;
    }
}

Array.prototype.entries () - ES6 +

यदि आप ES6 + वातावरण को लक्षित करने में सक्षम हैं तो आप अर्नावियन के उत्तर.entries() में उल्लिखित विधि का उपयोग कर सकते हैं ।


लेकिन टाइपस्क्रिप्ट को "के लिए" के लिए "एक सरल" के लिए संकलित किया गया है, जिसमें एक सूचकांक var _i है। इसलिए टाइपस्क्रिप्ट डेवलपर्स के लिए हमें इस _i का उपयोग करना आसान होगा। खेल के मैदान का उदाहरण देखें: bit.ly/1R9SfBR
मिक

2
@ यह लक्ष्य पर निर्भर करता है। जब ES6 को ट्रांसप्लिंग किया जाता है तो वह ऐसा नहीं करता है। उस अतिरिक्त कोड का कारण जब ट्रांसपाइलिंग केवल पिछले संस्करणों में काम करने के लिए ईएस 6 कोड प्राप्त करना है।
डेविड शेरेट

3
आप एक ब्रेक कैसे कर सकते हैं; कि forEach में?
जोआ सिल्वा

इसके अलावा एक अच्छा उत्तर stackoverflow.com/questions/34348937/…
क्रिस्टोफर ग्रिग

@ JoãoSilva का उपयोग कर सकते हैं Array.some()और उस पुनरावृत्ति पर झूठे वापस कर सकते हैं जिसे आप रोकना चाहते हैं। यह लगभग स्पष्ट या सुंदर नहीं है, breakलेकिन यह काम पूरा करेगा। व्यक्तिगत रूप से मुझे यह पसंद नहीं है, मैं शायद पुन: कुछ अन्य तरीके से पुनरावृत्ति लिखूंगा :) देखें stackoverflow.com/questions/2641347/…
निक नेम

36

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

for (var [key, item] of someArray.entries()) { ... }

टीएस में इसे ES2015 को लक्षित करने की आवश्यकता होती है क्योंकि इसे पुनरावृत्तियों का समर्थन करने के लिए रनटाइम की आवश्यकता होती है , जो ES5 रनटाइम नहीं करते हैं। आप निश्चित रूप से ईएस 5 रनटाइम पर आउटपुट कार्य करने के लिए बैबेल जैसे कुछ का उपयोग कर सकते हैं ।


35

बचाव के लिए "ओल्ड स्कूल जावास्क्रिप्ट" (उन लोगों के लिए जो कार्यात्मक प्रोग्रामिंग के प्यार में परिचित नहीं हैं)

for (let i = 0; i < someArray.length ; i++) {
  let item = someArray[i];
}

2
मैं वास्तव में इस उत्तर को सबसे ज्यादा पसंद करता हूं। केवल प्रत्येक तत्व के लिए एक सूचकांक उत्पन्न करने के लिए अतिरिक्त तरीकों का उपयोग नहीं करना।
ब्लू ग्राउंड्स

थैंक यू यू वेरी यू मुचु! हमें यह पता नहीं था :)
टीएसआर

14

आप उपयोग कर सकते हैं for..in उपयोग करने के लिए सूचकांक जब संग्रह के साथ काम कर टाइपप्रति ऑपरेटर।

var test = [7,8,9];
for (var i in test) {
   console.log(i + ': ' + test[i]);
} 

आउटपुट:

 0: 7
 1: 8
 2: 9

डेमो देखें


ध्यान रखें कि "i" एक स्ट्रिंग है जिसका for..in लूप के साथ इंट नहीं है। "I" के साथ अंकगणितीय ऑपरेशन करने से स्ट्रिंग संकेतन होगा। (i + 1) उदाहरण के लिए "01" के बराबर होगा जब i = 0
स्टीफन

for..inआपको उम्मीद से अधिक दे सकता है क्योंकि इसमें ऑब्जेक्ट पर घोषित सभी कार्य शामिल हैं। उदाहरण के लिए:for (var prop in window.document) { console.log(prop); }
केन ल्योन

5

या एक और पुराने स्कूल समाधान:

var someArray = [9, 2, 5];
let i = 0;
for (var item of someArray) {
    console.log(item); // 9,2,5
    i++;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.