पाश के लिए अंदर ES6 सरणी तत्व सूचकांक तक पहुँच


228

हम फॉर-लूप का उपयोग करके ऐरे तत्वों तक पहुँच सकते हैं:

for (const j of [1, 2, 3, 4, 5]) {
  console.log(j);
}

वर्तमान कोड तक पहुँचने के लिए मैं इस कोड को कैसे संशोधित कर सकता हूँ? मैं सिंटैक्स के लिए इसका उपयोग करना चाहता हूं, न तो फॉरएच और न ही फॉर-इन।

जवाबों:


351

उपयोग करें Array.prototype.keys:

for (const index of [1, 2, 3, 4, 5].keys()) {
  console.log(index);
}

आप का उपयोग करने के लिए दोनों कुंजी और मान चाहते हैं, आप उपयोग कर सकते हैं Array.prototype.entries()के साथ destructuring :

for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
  console.log(index, value);
}


64
अगर किसी को आश्चर्य होता है, तो मैंने परीक्षण for-ofकिया .entries()और इसकी तुलना में यह दोगुना है .forEach()jsperf.com/for-of-vs-foreach-with-index

1
@ K48 जानकर अच्छा लगा, "उलट-पुलट के लिए" का उपयोग करें यदि आप तों में सबसे तेज चाहते हैं: अविश्वसनीय-
web.com/blog/…

3
दुर्भाग्य से, मुझे नेस्टेड लूप के अंदर से उपज की आवश्यकता है। ForEach का उपयोग नहीं किया जा सकता, क्योंकि फ़ंक्शन yieldकीवर्ड के लिए गुंजाइश समस्याएँ पैदा करता है । लेकिन मुझे अपने उपयोग के मामले के लिए सूचकांक तक पहुंच की आवश्यकता है, इसलिए ... मूल पुराने ;;लूप यह है, मुझे लगता है।
काइल बेकर

2
@ KyleBaker और क्या एक पाश के लिए के साथ गलत है .entires()?
21:30 पर मिशाल पेरोलाकोव्स्की

1
रिवर्स लूप के बजाय आप कैश लंबाई jsperf.com/reverse-loop-vs-cache कर सकते हैं । जब आप RAM में बड़ी सरणियाँ बनाए बिना स्ट्रीम को प्रोसेस करने में सक्षम होते हैं, तो पुनरावृत्त प्रसंस्करण के लिए उपयोगी के लिए। लूप की गति अड़चन नहीं होगी क्योंकि आपके पास ऐसे मामलों में आई / ओ विलंबता होगी।
x'ES

289

Array#entries यदि आपको दोनों की आवश्यकता है, तो सूचकांक और मूल्य लौटाता है:

for (let [index, value] of array.entries()) {

}

3
टाइपस्क्रिप्ट के साथ: 'TS2495: टाइप IterableIterator एक सरणी प्रकार या एक स्ट्रिंग प्रकार नहीं है'। इस तरह लगता है हल हो जाएगा: github.com/Microsoft/TypeScript/pull/12346
जोहान्स

2
इसके अलावा इंटरनेट एक्सप्लोरर समर्थित नहीं है।
सैमी

1
अच्छा नहीं है। एक त्रुटि जैसे कि document.styleSheets[0].cssRules.entries()या यहां तक ​​कि document.styleSheets.entries()और शायद कई अन्य डोम चलने योग्य संरचनाओं को फेंकता है । अभी भी से उपयोग करना _.forEach()हैlodash
स्टीवन Pribilinskiy

2
@ उत्तर: यदि आपको सूचकांक की आवश्यकता नहीं है, तो आप बस कर सकते हैं for (var value of document.styleSheets) {}। आप सूचकांक की जरूरत है, तो आप के माध्यम से पहले एक सरणी के लिए मूल्य में बदल सकते हैं Array.from: for (let [index, value] of Array.from(document.styleSheets)) {}
फेलिक्स क्लिंग

1
वह अच्छा हैं! Array.fromहै FTW
स्टीवन Pribilinskiy

28

आकर्षक नए देशी कार्यों की इस दुनिया में, हम कभी-कभी मूल बातें भूल जाते हैं।

for (let i = 0; i < arr.length; i++) {
    console.log('index:', i, 'element:', arr[i]);
}

साफ, कुशल, और आप अभी भी breakलूप कर सकते हैं । बक्शीश! आप भी अंत से शुरू कर सकते हैं और पीछे की ओर जा सकते हैं i--!

अतिरिक्त नोट: यदि आप लूप के भीतर बहुत अधिक मूल्य का उपयोग कर रहे हैं, तो आप const value = arr[i];एक आसान, पठनीय संदर्भ के लिए लूप के शीर्ष पर करना चाह सकते हैं ।


1
हां। अच्छा एक, स्पष्ट और सरल। ओह, और इस तरह से आपके पास एरे की कुंजी / इंडेक्स तक पहुंचने का एक आसान तरीका है।
मिलाएं

2
वैसे हालत इस तरह दिखनी चाहिए -> के लिए (चलो i = 0; i <arr.length; i ++) बिना (-1) या यह सरणी के सभी तत्वों में लूप नहीं होगा।
मिलाएं

1
@Combine अच्छी पकड़! मैंने आपके नोट को दर्शाने के लिए अपना उत्तर अपडेट कर दिया है।
क्रिस

4
तुम अब भी कर सकते हैं breakएक for-ofऔर for (let [index, value] of array.entries())दूर पढ़ने में आसान है। पीछे की तरफ जाना जितना आसान है उतना ही आसान है .reverse()
निगेल बी। पेक

3
मुझे लगता है कि यह इस सवाल का पूरी तरह स्वीकार्य जवाब है। यह कभी भी स्वीकृत उत्तर नहीं होगा, लेकिन इसने कुछ दर्जन लोगों या अधिक लोगों की मदद की है जिन्होंने इस प्रश्न की खोज की है। यह एसओ के लिए है।
दानोरम

3

HTML / js के संदर्भ में, आधुनिक ब्राउज़रों पर, Arrays की तुलना में अन्य पुनरावृत्त वस्तुओं के साथ हम [Iterable] .entries () का भी उपयोग कर सकते हैं।

for(let [index, element] of document.querySelectorAll('div').entries()) {

    element.innerHTML = '#' + index

}

हाँ, यह काम करता है, जबकि अन्य @Steven Pribilinskiy द्वारा उपर्युक्त अन्य DOM तरीके उन वस्तुओं को लौटाते हैं जिनके लिए कोई entriesविधि नहीं है ।
मेटनस्टर

3

एक for..ofलूप में हम इसे हासिल कर सकते हैं array.entries()array.entriesएक नया ऐरे इटेरेटर ऑब्जेक्ट देता है। एक पुनरावृत्त वस्तु यह जानती है कि उस समय एक पुनरावृत्ति से वस्तुओं तक कैसे पहुंचा जा सकता है, जबकि उस क्रम के भीतर इसकी वर्तमान स्थिति पर नज़र रखता है।

जब next()विधि को इट्रेटर पर बुलाया जाता है तो कुंजी मूल्य जोड़े उत्पन्न होते हैं। इन प्रमुख मूल्य युग्मों में ऐरे इंडेक्स कुंजी है और एरे आइटम मद है।

let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']

एक for..ofलूप मूल रूप से एक निर्माण होता है जो एक पुनरावृत्ति का उपभोग करता है और सभी तत्वों के माध्यम से छोरों का उपयोग करता है (हुड के तहत एक इटरेटर का उपयोग करके)। हम इसे array.entries()निम्नलिखित तरीके से जोड़ सकते हैं :

array = ['a', 'b', 'c'];

for (let indexValue of array.entries()) {
  console.log(indexValue);
}


// we can use array destructuring to conveniently
// store the index and value in variables
for (let [index, value] of array.entries()) {
   console.log(index, value);
}


3

यदि आप सूचकांक की जरूरत है, तो आप अपने आप को सूचकांक भी संभाल सकते हैं , यदि आपको कुंजी की आवश्यकता है तो यह काम नहीं करेगा ।

let i = 0;
for (const item of iterableItems) {
  // do something with index
  console.log(i);

  i++;
}

0

उन वस्तुओं का उपयोग करने वालों के लिए जो एक Arrayया यहां तक ​​कि सरणी की तरह नहीं हैं, आप आसानी से अपने स्वयं के चलने योग्य बना सकते हैं ताकि आप अभी भी उन for ofचीजों के लिए उपयोग कर सकें , localStorageजिनके पास वास्तव में केवल एक है length:

function indexerator(length) {
    var output = new Object();
    var index = 0;
    output[Symbol.iterator] = function() {
        return {next:function() {
            return (index < length) ? {value:index++} : {done:true};
        }};
    };
    return output;
}

तो बस इसे एक नंबर फ़ीड करें:

for (let index of indexerator(localStorage.length))
    console.log(localStorage.key(index))

0

ES6 for...in

for(const index in [15, 64, 78]) {                        
    console.log(index);
}

5
सवाल for...ofलूप के बारे में नहीं पूछ रहा हैfor...in
अब्राहम

3
for...inमूल ECMAScript विनिर्देशन (यानी "es1") का हिस्सा है। इसके अलावा, ध्यान दें कि for...inऑब्जेक्ट गुणों पर पुनरावृत्ति के लिए है। हालांकि यह सरणियों पर पुनरावृत्ति कर सकता है, लेकिन यह अपेक्षित क्रम में ऐसा नहीं कर सकता है। MDN प्रलेखन
Boaz

0

एक अन्य दृष्टिकोण के Array.prototype.forEach()रूप में उपयोग किया जा सकता है

Array.from({
  length: 5
}, () => Math.floor(Math.random() * 5)).forEach((val, index) => {
  console.log(val, index)
})


-6
var fruits = ["apple","pear","peach"];
for (fruit of fruits) {
    console.log(fruits.indexOf(fruit));
    //it shows the index of every fruit from fruits
}

के लिए लूप सरणी का पता लगाता है, जबकि अनुक्रमणिका संपत्ति उस सूचकांक के मूल्य को लेती है जो सरणी से मेल खाती है। पीडी इस पद्धति में संख्याओं के साथ कुछ खामियां हैं, इसलिए फलों का उपयोग करें


2
इसमें O (n ^ 2) समय लगता है।
हैरी

3
ऐसे मामलों में जहां प्रदर्शन महत्वपूर्ण नहीं है, यह अभी भी डुप्लिकेट फल होने पर सभी सही इंडेक्स नहीं देता है। उदाहरण के लिए, ["apple", "apple", "pear"]दिए गए इंडेक्स के 0, 0, 2बजाय हैं 0, 1, 2
ट्राइकोप्लाक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.