2016-03-19 10 views
50

के रूप में वर्णित here टाइपप्रति एक foreach पाश का परिचय:इंडेक्स/कुंजी के साथ ... के लिए टाइपस्क्रिप्ट?

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

लेकिन वहाँ किसी भी सूचकांक/कुंजी नहीं है? मैं उम्मीद होती है कुछ की तरह:

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

उत्तर

93

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

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

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

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

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

function toItemIndexes<T>(a: T[]) { 
    return a.map((item, index) => ({ item, index })); 
} 

for (const {item, index} of toItemIndexes(someArray)) { 
    // ..etc.. 
} 

Iterable संस्करण

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

function* toItemIndexes<T>(items: T[] | IterableIterator<T>) { 
    let index = 0; 
    for (const item of items) { 
     yield { item, index }; 
     index++; 
    } 
} 
+0

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

+2

@ मिक यह लक्ष्य पर निर्भर करता है। ES6 पर पारदर्शी होने पर यह ऐसा नहीं करता है। पारदर्शी होने पर उस अतिरिक्त कोड का कारण केवल पिछले संस्करणों में ES6 कोड काम करने के लिए है। –

+2

आप ब्रेक कैसे कर सकते हैं; उसमें हर किसी के लिए? –

11

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

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

टीएस में इस ES2015 since it requires the runtime to support iterators, जो ES5 runtimes नहीं लक्षित कर की आवश्यकता है। ईएस 5 रनटाइम पर आउटपुट काम करने के लिए आप निश्चित रूप से Babel जैसे कुछ का उपयोग कर सकते हैं।

5

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

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

आप सूचकांक का उपयोग करने की for..in टाइपप्रति ऑपरेटर का उपयोग कर सकते हैं संग्रह से निपटने पर।

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

आउटपुट:

0: 7 
1: 8 
2: 9 

"के लिए" Demo

संबंधित मुद्दे