लूप के लिए जावास्क्रिप्ट कैसे बंद करें?


127

मैं इस जावास्क्रिप्ट का उपयोग एक सरणी के माध्यम से पुनरावृत्ति करने और एक मिलान सरणी तत्व खोजने के लिए कर रहा हूँ:

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

सरणी में ये "आकार" होते हैं ["34", "36", "38"...]:।

remData.size "आकार" मैं देख रहा हूँ (जैसे "36")।

iअगर मुझे जिस आकार की खोज करनी है, मैं सूचकांक को वापस करने की आवश्यकता है । अन्यथा मुझे लौटने की जरूरत है -1। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

जवाबों:


193

forजावास्क्रिप्ट लूप को जल्दी रोकने के लिए , आप उपयोग करते हैं break:

var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}

यदि आप ES2015 (उर्फ ES6) परिवेश में हैं, तो इस विशिष्ट उपयोग के मामले के लिए, आप Array#findIndex(प्रविष्टि का अनुक्रमणिका खोजने के लिए) या Array#find(स्वयं प्रविष्टि को खोजने के लिए ) का उपयोग कर सकते हैं , दोनों को शर्मसार / पॉलीफ़िल्ड किया जा सकता है:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});

Array#find:

var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});

Array#findIndexपहली बार कॉलबैक एक सत्य मान देता है, कॉलबैक के लिए उस सूचकांक को वापस करता है; -1यदि कॉलबैक कभी भी सत्य मान नहीं देता है तो यह वापस आ जाता है। Array#findयह तब भी रुक जाता है जब आपको पता चलता है कि आप क्या खोज रहे हैं, लेकिन यह प्रविष्टि लौटाता है, न कि इसका सूचकांक (या undefinedयदि कॉलबैक कभी सत्य मूल्य नहीं लौटाता है)।

यदि आप ईएस 5-संगत वातावरण (या ईएस 5 शिम) का उपयोग कर रहे हैं, तो आप सरणियों पर नए someफ़ंक्शन का उपयोग कर सकते हैं , जो कॉलबैक तब तक कॉल करता है जब तक कॉलबैक एक सत्य मान नहीं देता है:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});

यदि आप jQuery का उपयोग कर रहे हैं, तो आप jQuery.eachएक सरणी के माध्यम से लूप का उपयोग कर सकते हैं ; यह इस तरह दिखेगा:

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});

1
रिटर्न स्टेटमेंट का उपयोग करना एक अच्छा तरीका है। धन्यवाद @ टीजे क्राउडर
Techloris_109

@ टीजे क्राउडर कौन सा कथन एक अच्छा दृष्टिकोण है: झूठे लौटें या टूटें?
इलियास करीम

3
@Ilyaskarim: आप अपने द्वारा उपयोग किए जा रहे निर्माण के लिए एक उपयुक्त का उपयोग करते हैं ( breakएक forलूप return falseमें jQuery.each, return trueमें some, ...)।
टीजे क्राउडर

13

इसके बजाय लूप के लिए उपयोग करें जो ES2015 रिलीज का हिस्सा है। फॉरच के विपरीत, हम रिटर्न, ब्रेक और जारी रख सकते हैं। Https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/ देखें

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}

es6 का अच्छा उपयोग, मुझे लगता है कि यह यहां सबसे अच्छे उत्तरों में से एक है
इमाद सलाह

वास्तव में, मैं कहूंगा कि यह सबसे अच्छा जवाब है - इसे करने का सबसे साफ तरीका ("सरणी तत्वों के माध्यम से लूपिंग के लिए सबसे संक्षिप्त, प्रत्यक्ष वाक्यविन्यास", जैसा कि मोज़िला हैक्स जवाब में लिंक में कहते हैं)। हमें अपनी नई सुविधाओं का उपयोग करके जहाँ भी हम कर सकते हैं ईएस 6 में गए सभी कठिन परिश्रम को चुकाना चाहिए (और इस प्रक्रिया में खुद को लाभान्वित करें)।
वेलोजेट

10

तर्क गलत है। यह हमेशा सरणी में अंतिम तत्व का परिणाम लौटाएगा।

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}

0

मुझे पता है कि यह थोड़ा पुराना है, लेकिन एक लूप के साथ सरणी के माध्यम से लूपिंग के बजाय, विधि का उपयोग करना बहुत आसान होगा <array>.indexOf(<element>[, fromIndex])

यह एक सरणी के माध्यम से लूप करता है, एक मूल्य के पहले सूचकांक को ढूंढना और वापस करना। यदि मान सरणी में समाहित नहीं है, तो यह -1 देता है।

<array>देखने के लिए सरणी है, <element>वह मान है जिसकी आप तलाश कर रहे हैं, और [fromIndex]शुरू करने के लिए सूचकांक है (चूक से 0)।

मुझे उम्मीद है कि यह आपके कोड के आकार को कम करने में मदद करता है!


1
यह शीर्षक सवाल का जवाब नहीं है: How to stop a JavaScript for loop?यह करता है इस सवाल का जवाब कोई भी मिलान के सूचकांक वापस जाने के लिए / -1 अगर कोई एक बेहतर तरीका है
ग्रेबर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.