"जारी रखें" कर्सर में।


279

मैं meteor.js और MongoDB का उपयोग करके एक ऐप बना रहा हूं और मेरे पास कर्सर.forEach () के बारे में एक प्रश्न है। मैं प्रत्येक पूर्वाभास की शुरुआत में कुछ शर्तों की जांच करना चाहता हूं और फिर तत्व को छोड़ देता हूं अगर मुझे इस पर ऑपरेशन नहीं करना है तो मैं कुछ समय बचा सकता हूं।

यहाँ मेरा कोड है:

// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
  if (element.shouldBeProcessed == false){
    // Here I would like to continue to the next element if this one 
    // doesn't have to be processed
  }else{
    // This part should be avoided if not neccessary
    doSomeLengthyOperation();
  }
});

मुझे पता है कि मैं कर्सर का उपयोग कर कर्सर को बदल सकता हूं। फेस () () (लाने) और फिर तत्वों पर पुनरावृति करने के लिए नियमित रूप से लूप का उपयोग करें और सामान्य रूप से जारी रखने और तोड़ने का उपयोग करें, लेकिन मुझे दिलचस्पी है अगर फॉरच में उपयोग करने के लिए कुछ परिचित है ( )।

जवाबों:


561

forEach()वसीयत का प्रत्येक पुनरावृत्ति उस फ़ंक्शन को कॉल करेगा जिसे आपने आपूर्ति की है। किसी दिए गए पुनरावृत्ति (और अगले आइटम के साथ जारी रखें) के भीतर आगे की प्रक्रिया को रोकने के लिए आपको बस returnउचित बिंदु पर फ़ंक्शन से निकलना होगा:

elementsCollection.forEach(function(element){
  if (!element.shouldBeProcessed)
    return; // stop processing this iteration

  // This part will be avoided if not neccessary
  doSomeLengthyOperation();
});

18
क्या आप जानते हैं कि "ब्रेक" क्या हो सकता है, अगर जारी रखना सिर्फ "वापसी" है।
ड्रैग0

5
मैं MongoDB का उपयोग नहीं करता हूं इसलिए इसके प्रलेखन को नहीं पढ़ा है, लेकिन यह संभव है कि यह (jQuery लूप के लिए) return false;के बराबर होगा । बेशक जो कोई भी MongoDB को लागू कर सकता है उसके पास अन्य विचार हो सकते हैं ...break;.each().forEach()
nnnnnn

9
@ Drag0 आप .some () .forEach () के प्रतिस्थापन के रूप में उपयोग कर सकते हैं, जो लूप को तोड़ने के लिए आपको वापस लौटने में सक्षम बनाता है।
एंड्रयू

6
@ और आप उपयोग कर सकते हैं some, बस इस बात से अवगत रहें कि आप एक ऐसे फ़ंक्शन का दुरुपयोग कर रहे हैं (या रचनात्मक रूप से उपयोग कर रहे हैं) जिसका उद्देश्य यह बताना था कि कोई भी तत्व स्थिति से मेल खाता है या नहीं। जब मैं लोगों को उपयोग करते हुए देखता हूं mapऔर परिणाम को अनदेखा करता हूं, तो forEach)यह पसंद है। यह शब्दार्थ है, लोगों को यह जानने के लिए दो बार देखना होगा कि someजब आप परिणाम के बारे में वास्तव में परवाह नहीं करते हैं, तो
जुआन मेंडेस

1
@ और महान टिप, हालांकि यह है return trueजो कुछ पाश को तोड़ देगा
daviestar

11

मेरी राय में इस filter पद्धति का उपयोग करके इसे प्राप्त करने का सबसे अच्छा तरीका है क्योंकि यह एक forEachब्लॉक में वापस आने के लिए अर्थहीन है ; अपने स्निपेट पर एक उदाहरण के लिए:

// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection
.filter(function(element) {
  return element.shouldBeProcessed;
})
.forEach(function(element){
  doSomeLengthyOperation();
});

यह आपके संकुचन को कम करेगा elementsCollectionऔर बस उन filtredतत्वों को रखेगा जो संसाधित किए जाने चाहिए।


3
यह पाया तत्वों को दो बार पुनरावृत्त करेगा, एक बार filterऔर दूसरे में forEachअगर यह एक बड़ा संग्रह है, तो यह बहुत अक्षम होगा
स्मरणात्मक

1
आप सही हैं, लेकिन मुझे नहीं लगता कि यह एक बड़ी बात है क्योंकि इस समय की जटिलता ऐसी होगी O(2n)जिस पर विचार किया जा सकता है O(n)
रेमी टेमर

2
एसओ को ध्यान में रखते हुए दूसरों द्वारा इस्तेमाल किया जा रहा है, न कि केवल ओपी, इसे पोस्ट करने के उद्देश्य से एक समाधान पोस्ट करना, अच्छे से अधिक नुकसान पैदा कर रहा है। उपरोक्त उत्तर एक पुनरावृत्ति में करता है और इसे करने का rightतरीका है।
दैविक

ध्यान दें कि ओपी का संग्रह एक सरणी नहीं है, यह एक मैंगो डीबी कर्सर ऑब्जेक्ट है, जो एक .filter()विधि नहीं लगती है , इसलिए आपको .toArray()इससे पहले अपनी विधि को कॉल करना होगा.filter()
nnnnnn

7

यहाँ एक समाधान का उपयोग कर for ofऔर continueइसके बजाय है forEach:


let elementsCollection = SomeElements.find();

for (let el of elementsCollection) {

    // continue will exit out of the current 
    // iteration and continue on to the next
    if (!el.shouldBeProcessed){
        continue;
    }

    doSomeLengthyOperation();

});

यह थोड़ा और उपयोगी हो सकता है यदि आपको अपने लूप के अंदर अतुल्यकालिक कार्यों का उपयोग करने की आवश्यकता होती है जो अंदर काम नहीं करते हैं forEach। उदाहरण के लिए:


(async fuction(){

for (let el of elementsCollection) {

    if (!el.shouldBeProcessed){
        continue;
    }

    let res;

    try {
        res = await doSomeLengthyAsyncOperation();
    } catch (err) {
        return Promise.reject(err)
    }

});

})()

2

जावास्क्रिप्शंस का शॉर्ट-सर्किट मूल्यांकन का उपयोग करना । अगर यह el.shouldBeProcessedसच है,doSomeLengthyOperation

elementsCollection.forEach( el => 
  el.shouldBeProcessed && doSomeLengthyOperation()
);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.