JQuery में सरणी के माध्यम से लूप कैसे करें?


234

मैं एक सरणी के माध्यम से लूप करने की कोशिश कर रहा हूं। मेरे पास निम्नलिखित कोड हैं:

 var currnt_image_list= '21,32,234,223';
 var substr = currnt_image_list.split(','); // array here

सरणी से सभी डेटा प्राप्त करने का प्रयास कर रहा हूँ। क्या कोई मुझे सही रास्ते पर ले जा सकता है?

जवाबों:


516

(अपडेट: मेरा अन्य उत्तर यहां गैर- jQuery विकल्पों को अधिक अच्छी तरह से व्याख्यायित करता है। नीचे दिया गया तीसरा विकल्प jQuery.eachहालांकि इसमें नहीं है।)


चार विकल्प:

सामान्य लूप:

var i;
for (i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

या ES2015 + में:

for (let i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

लाभ : सीधे-आगे, jQuery पर कोई निर्भरता, समझने में आसान, thisलूप के शरीर के भीतर के संरक्षण के साथ कोई समस्या नहीं, फ़ंक्शन कॉल का कोई अनावश्यक ओवरहेड (जैसे, सिद्धांत रूप में तेजी से, हालांकि वास्तव में आपके पास होगा इतने सारे तत्व हैं कि बाधाओं से आपको अन्य समस्याएं हैं; विवरण )।

ES5 की forEach:

ECMAScript5 के अनुसार, सरणियों का forEachउन पर एक फ़ंक्शन होता है जो सरणी के माध्यम से लूप को आसान बनाता है:

substr.forEach(function(item) {
    // do something with `item`
});

डॉक्स से लिंक करें

(नोट: वहाँ अन्य कार्यों के बहुत सारे हैं, न सिर्फ forEach; देखने जवाब ऊपर संदर्भित जानकारी के लिए।)

लाभ : घोषणात्मक, यदि आपके पास एक काम है, तो इट्रेटर के लिए एक प्रीबिल्ट फ़ंक्शन का उपयोग कर सकते हैं, यदि आपका लूप बॉडी जटिल है तो फ़ंक्शन कॉल की स्कोपिंग कभी-कभी उपयोगी होती है, iजिसमें आपके स्कोप वाले चर की कोई आवश्यकता नहीं होती है।

नुकसान : यदि आप thisयुक्त कोड का उपयोग कर रहे हैं और आप thisअपने forEachकॉलबैक में उपयोग करना चाहते हैं , तो आपको A को इसे एक चर में रखना होगा ताकि आप इसे फ़ंक्शन के भीतर उपयोग कर सकें, B) इसे दूसरे तर्क के रूप में पास forEachकरें कॉलबैक के दौरान forEachइसे सेट thisकरें, या C) ES2015 + एरो फ़ंक्शन का उपयोग करें , जो बंद हो जाता है this। आप उन चीजों में से एक ऐसा नहीं करते हैं, कॉलबैक में thisहोगा undefinedया वैश्विक वस्तु ((सख्त मोड में) window) ढीला मोड में। एक दूसरा नुकसान हुआ करता forEachथा जो सार्वभौमिक रूप से समर्थित नहीं था, लेकिन यहां 2018 में, आपके द्वारा चलाया जाने वाला एकमात्र ब्राउज़र forEachIE8 नहीं है (और यह ठीक से नहीं हो सकता है पॉलीफ़िल्ड वहाँ, या तो)।

ES2015 + की for-of:

for (const s of substr) { // Or `let` if you want to modify it in the loop body
    // do something with `s`
}

इस जवाब के शीर्ष पर जुड़ा हुआ विवरण देखें कि यह कैसे काम करता है।

लाभ : सरल, सीधा, सरणी से प्रविष्टि के लिए एक समांतर-स्कोप चर (या स्थिर, ऊपर) प्रदान करता है।

नुकसान : IE के किसी भी संस्करण में समर्थित नहीं है।

jQuery.each:

jQuery.each(substr, function(index, item) {
    // do something with `item` (or `this` is also `item` if you like)
});

( डॉक्स से लिंक करें )

लाभ : जैसे forEachकि आप jQuery का उपयोग कर रहे हैं, वैसे ही सभी फायदे भी हैं।

नुकसान : यदि आप thisयुक्त कोड का उपयोग कर रहे हैं , तो आपको इसे एक चर में रखना होगा ताकि आप इसे फ़ंक्शन के भीतर उपयोग कर सकें, क्योंकि फ़ंक्शन के भीतर thisइसका अर्थ कुछ और है।

आप इस thisचीज़ से बच सकते हैं , या तो उपयोग करके $.proxy:

jQuery.each(substr, $.proxy(function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}, this));

... या Function#bind:

jQuery.each(substr, function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}.bind(this));

... या ES2015 ("ES6") में, एक तीर फ़ंक्शन:

jQuery.each(substr, (index, item) => {
    // do something with `item` (`this` is the same as it was outside)
});

क्या नहीं करना है:

इसकेfor..in लिए उपयोग करें (या यदि आप करते हैं, तो इसे उचित सुरक्षा उपायों के साथ करें)। आप लोगों को यह कहते हुए देखेंगे (वास्तव में, संक्षेप में यहाँ एक उत्तर था जो कह रहा है), लेकिन for..inवह ऐसा नहीं करता है जो कई लोग सोचते हैं कि यह करता है (यह कुछ और भी उपयोगी है!)। विशेष रूप से, for..inकिसी ऑब्जेक्ट के एन्यूमरेबल प्रॉपर्टी नामों (किसी एरे के इंडेक्स नहीं) के माध्यम से लूप करता है। चूंकि सरणियाँ ऑब्जेक्ट्स हैं, और डिफ़ॉल्ट रूप से उनके केवल एन्यूमरेबल प्रॉपर्टीज़ इंडेक्स हैं, यह ज्यादातर ब्लैंड परिनियोजन में काम करने की तरह लगता है। लेकिन यह एक सुरक्षित धारणा नहीं है कि आप इसके लिए इसका इस्तेमाल कर सकते हैं। यहाँ एक अन्वेषण है: http://jsbin.com/exohi/3

मुझे ऊपर "नहीं" नरम करना चाहिए। यदि आप विरल सरणियों के साथ काम कर रहे हैं (उदाहरण के लिए, सरणी में कुल 15 तत्व हैं, लेकिन उनके lengthअनुक्रम किसी कारण से 0 से 150,000 के बीच में बिखरे हुए हैं, और इसलिए 150,001 है), और यदि आप उपयुक्त सुरक्षा उपायों का उपयोग करते हैं hasOwnPropertyऔर जाँच कर रहे हैं संपत्ति का नाम वास्तव में संख्यात्मक है (ऊपर लिंक देखें), for..inअनावश्यक छोरों के बहुत से बचने के लिए एक पूरी तरह से उचित तरीका हो सकता है, क्योंकि केवल आबादी वाले अनुक्रमितों की गणना की जाएगी।


किसी सरणी पर उपयोग .each()या for...inलूप करना सामान्य रूप से एक बुरा विचार है। यह उम्र का उपयोग करने की तुलना में धीमी है forया की तरह है while। एक का उपयोग करते हुए for loopकैश करने के लिए यह भी एक बहुत अच्छा विचार lengthपाशन से पहले संपत्ति। for (var i = 0, len = substr.length; i < len; ...
जॉन्डी

@jAndy: मेरा मानना ​​है कि मैंने उल्लेख किया है कि पहले एक का फायदा हुआ है। लंबाई को कैशिंग करते हुए, यह ओवरहेड के लायक होने के लिए वास्तव में एक बड़ा सरणी होना चाहिए, लेकिन उचित 'नफ़'।
टीजे क्राउडर

1
@MikePurcell: या एरो फंक्शन। या Function#bind। :-) अच्छा बिंदु, जोड़ा गया।
टीजे क्राउडर


1
@DougS: नहीं, केवल एक ही अंतर है i++और ++iउस अभिव्यक्ति का परिणाम है, जिसका उपयोग ऊपर दिए गए उदाहरण में कभी नहीं किया गया है। एक forलूप इस तरह काम करता है: 1. इनिशियलाइज़ेशन, 2. टेस्ट (यदि गलत है तो समाप्त करें), 3. बॉडी, 4. अपडेट, 5. स्टेप पर लौटें 2. अपडेट एक्सप्रेशन का परिणाम किसी भी चीज़ के लिए उपयोग नहीं किया जाता है।
टीजे क्राउडर

75

jQuery.each ()

jQuery.each ()

jQuery.each(array, callback)

सरणी पुनरावृत्ति

jQuery.each(array, function(Integer index, Object value){});

वस्तु पुनरावृत्ति

jQuery.each(object, function(string propertyName, object propertyValue){});

उदाहरण :

var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) { 
  console.log(index, val)
});

var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
  console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

सरणी के लिए जावास्क्रिप्ट लूप

पाश के लिए

for (initialExpression; condition; incrementExpression)
  statement

उदाहरण

var substr = [1, 2, 3, 4];

//loop from 0 index to max index
for(var i = 0; i < substr.length; i++) {
  console.log("loop", substr[i])
}

//reverse loop
for(var i = substr.length-1; i >= 0; i--) {
  console.log("reverse", substr[i])
}

//step loop
for(var i = 0; i < substr.length; i+=2) {
  console.log("step", substr[i])
}

अंदर के लिए

//dont really wnt to use this on arrays, use it on objects
for(var i in substr) {
    console.log(substr[i]) //note i returns index
}

के लिए

for(var i of subs) {
    //can use break;
    console.log(i); //note i returns value
}

प्रत्येक के लिए

substr.forEach(function(v, i, a){
    //cannot use break;
    console.log(v, i, a);
})

साधन

MDN लूप और पुनरावृत्तियों


21

यहाँ jquery की कोई आवश्यकता नहीं है, बस एक forलूप काम करता है:

var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
  alert(substr[i]);
}

18

विकल्प 1: पारंपरिक- forलूप

मूल बातें

एक पारंपरिक- forलूप के तीन घटक हैं:

  1. इनिशियलाइज़ेशन: लुक ब्लॉक से पहले निष्पादित पहली बार निष्पादित किया गया है
  2. शर्त: लूप ब्लॉक निष्पादित होने से पहले हर बार एक स्थिति की जांच करता है, और यदि गलत है तो लूप को छोड़ देता है
  3. बाद में: लूप ब्लॉक निष्पादित होने के बाद हर बार प्रदर्शन किया जाता है

इन तीन घटकों को एक दूसरे से एक ;प्रतीक द्वारा अलग किया जाता है । इन तीन घटकों में से प्रत्येक के लिए सामग्री वैकल्पिक है, जिसका अर्थ है कि निम्नलिखित सबसे न्यूनतम forसंभव है:

for (;;) {
    // Do stuff
}

बेशक, आपको चलने के लिए इसे पाने के लिए उस -loop के अंदर if(condition === true) { break; } या if(condition === true) { return; }कहीं एक को शामिल करना होगा for

आमतौर पर, हालांकि, इनिशियलाइज़ेशन का उपयोग इंडेक्स को घोषित करने के लिए किया जाता है, इस शर्त का उपयोग उस इंडेक्स की न्यूनतम या अधिकतम मूल्य के साथ तुलना करने के लिए किया जाता है, और बाद में इंडेक्स को बढ़ाने के लिए उपयोग किया जाता है:

for (var i = 0, length = 10; i < length; i++) {
    console.log(i);
}

forएक सरणी के माध्यम से लूप के लिए एक पारंपरिक- लूप का उपयोग करना

एक सरणी के माध्यम से लूप करने का पारंपरिक तरीका यह है:

for (var i = 0, length = myArray.length; i < length; i++) {
    console.log(myArray[i]);
}

या, यदि आप पीछे की ओर लूप करना पसंद करते हैं, तो आप ऐसा करते हैं:

for (var i = myArray.length - 1; i > -1; i--) {
    console.log(myArray[i]);
}

हालाँकि, कई बदलाव संभव हैं, जैसे कि। यह वाला :

for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
    console.log(value);
}

... या यह एक ...

var i = 0, length = myArray.length;
for (; i < length;) {
    console.log(myArray[i]);
    i++;
}

... या यह एक:

var key = 0, value;
for (; value = myArray[key++];){ 
    console.log(value);
}

जो भी सबसे अच्छा काम करता है वह काफी हद तक व्यक्तिगत स्वाद और आपके द्वारा लागू किए जाने वाले विशिष्ट उपयोग के मामले में होता है।

ध्यान दें :

इन भिन्नताओं में से प्रत्येक को सभी ब्राउज़रों द्वारा समर्थित किया जाता है, जिसमें पुराने वाले भी शामिल हैं!


विकल्प 2: while-लूप

for-लूप का एक विकल्प एक लूप है while। सरणी के माध्यम से लूप करने के लिए, आप ऐसा कर सकते हैं:

var key = 0;
while(value = myArray[key++]){
    console.log(value);
}
ध्यान दें :

पारंपरिक- forफ्लॉप की तरह , while-लूप्स ब्राउज़रों के सबसे पुराने द्वारा भी समर्थित हैं।

इसके अलावा, हर forलूप को एक लूप के रूप में फिर से लिखा जा सकता है । उदाहरण के लिए, while-loop hereabove इस -loop के समान ही व्यवहार करता है for:

for(var key = 0;value = myArray[key++];){
    console.log(value);
}

विकल्प 3: for...inऔरfor...of

जावास्क्रिप्ट में, आप यह भी कर सकते हैं:

for (i in myArray) {
    console.log(myArray[i]);
}

हालांकि, इसका उपयोग सावधानी के साथ किया जाना चाहिए, क्योंकि यह forसभी मामलों में ट्रेडिटनल- लूप के समान व्यवहार नहीं करता है , और संभावित साइड-इफेक्ट्स हैं जिन पर विचार करने की आवश्यकता है। देखें क्यों "इट्स ... इन" एरे इटरेशन के साथ एक बुरे विचार का उपयोग कर रहा है? अधिक जानकारी के लिए।

एक विकल्प के रूप में for...in, अब के लिए भी है for...of। निम्नलिखित उदाहरण एक for...ofलूप और लूप के बीच अंतर को दर्शाता है for...in:

var myArray = [3, 5, 7];
myArray.foo = "hello";

for (var i in myArray) {
  console.log(i); // logs 0, 1, 2, "foo"
}

for (var i of myArray) {
  console.log(i); // logs 3, 5, 7
}
ध्यान दें :

आपको यह भी विचार करने की आवश्यकता है कि इंटरनेट एक्सप्लोरर का कोई भी संस्करण for...of( एज 12+ नहीं करता है) और for...inइसके लिए कम से कम IE10 की आवश्यकता होती है।


विकल्प 4: Array.prototype.forEach()

For-लूप का एक विकल्प है Array.prototype.forEach(), जो निम्नलिखित सिंटैक्स का उपयोग करता है:

myArray.forEach(function(value, key, myArray) {
    console.log(value);
});
ध्यान दें :

Array.prototype.forEach() सभी आधुनिक ब्राउज़रों द्वारा समर्थित है, साथ ही IE9 +।


विकल्प 5: jQuery.each()

इसके अलावा उल्लिखित चार अन्य विकल्पों में, jQuery की भी अपनी foreachभिन्नता थी।

यह निम्नलिखित सिंटैक्स का उपयोग करता है:

$.each(myArray, function(key, value) {
    console.log(value);
});


7

JQuery का उपयोग करें each()। अन्य तरीके हैं लेकिन प्रत्येक को इस उद्देश्य के लिए डिज़ाइन किया गया है।

$.each(substr, function(index, value) { 
  alert(value); 
});

और अंतिम संख्या के बाद अल्पविराम न लगाएं।


बहुत अच्छा समाधान!
लॉर्ड नाइटन

3

आप एक for()लूप का उपयोग कर सकते हैं :

var things = currnt_image_list.split(','); 
for(var i = 0; i < things.length; i++) {
    //Do things with things[i]
}

3

तीर फ़ंक्शन और प्रक्षेप के साथ ES6 सिंटैक्स:

var data=["a","b","c"];
$(data).each((index, element) => {
        console.log(`current index : ${index} element : ${element}`)
    });

2

इसे इस्तेमाल करे:

$.grep(array, function(element) {

})

1
नमस्ते! कृपया कुछ स्पष्टीकरण जोड़ें कि यह ओपी की समस्या को कैसे हल करता है। यह आमतौर पर एसओ पर केवल कोड पोस्ट करने के लिए हतोत्साहित किया जाता है क्योंकि वे ओपी या भविष्य के आगंतुकों को जवाब समझने में मदद नहीं करते हैं। धन्यवाद! - समीक्षा से।
d_kennetz

0

साइड इफेक्ट के साथ सरणी / स्ट्रिंग के माध्यम से पुनरावृत्ति के वैकल्पिक तरीके

var str = '21,32,234,223';
var substr = str.split(',');

substr.reduce((a,x)=> console.log('reduce',x), 0)        // return undefined

substr.every(x=> { console.log('every',x); return true}) // return true

substr.some(x=> { console.log('some',x); return false})  // return false

substr.map(x=> console.log('map',x));                    // return array
 
str.replace(/(\d+)/g, x=> console.log('replace',x))      // return string

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.