दिलचस्प पोस्ट
लॉलीपॉप पर पूरी तरह से पारदर्शी स्थिति बार और नेविगेशन बार किसी प्रकार के स्विच-केस का उपयोग कैसे करें? मुझे अपने विधानसभाओं को जीएसी में कब तैनात करना चाहिए? स्ट्रिंग से सभी लाइन ब्रेक को कैसे निकालें? स्ट्रिंग से होस्टनाम नाम निकालें सर्वर को पोस्ट, पीडीएफ प्राप्त करें, उपयोगकर्ता w / jQuery पर पहुंचें उन मामलों में क्या हैं जिनमें बिना शर्त और उपयोग करने के लिए बेहतर है (और इसके बजाय &&) अहस्ताक्षरित पूर्णांक में सी रिवर्स बिट्स एंड्रॉइड 2.2 में संपर्क सम्मिलित करना "अनचाहे संदर्भ" त्रुटि: यह परिभाषित नहीं है "श्रेणी के निर्माता में बिना क्रमबद्ध तालिका में अंतिम 5 पंक्तियों का चयन कैसे करें? क्या सॉर्टेड सूची <कश्मीर, वी> पर एक निचला बाउंड फ़ंक्शन है? विज़ुअल स्टूडियो अनुप्रयोग को परिनियोजित करने का सर्वोत्तम तरीका जो बिना इंस्टॉल किए जा सकता है बिट बदलावों का उपयोग करके 10 से विभाजित? रिलेशनल डेटाबेस में एक कैटलॉग और एक स्कीमा के बीच क्या अंतर है?

क्या भविष्य और मानचित्र के बीच अंतर है?

ठीक है, यह एक कंप्यूटर साइंस प्रश्न का अधिक है, एक विशेष भाषा के आधार पर एक प्रश्न के मुकाबले, लेकिन क्या मैप ऑपरेशन और एक प्रेशर ऑपरेशन के बीच अंतर है? या वे एक ही बात के लिए बस अलग नाम हैं?

वेब के समाधान से एकत्रित समाधान "क्या भविष्य और मानचित्र के बीच अंतर है?"

विभिन्न।

फॉच एक सूची पर पुनरावृत्त होता है और प्रत्येक सूची सदस्य को साइड इफेक्ट के साथ कुछ ऑपरेशन लागू करता है (उदाहरण के लिए डेटाबेस को प्रत्येक को सहेजना)

मानचित्र एक सूची पर पुनरावृत्त करता है, उस सूची के प्रत्येक सदस्य को रूपांतरित करता है, और तब्दील सदस्यों के साथ समान आकार की दूसरी सूची देता है (जैसे कि तार की सूची को ऊपरी में परिवर्तित करना)

उनके बीच महत्वपूर्ण अंतर यह है कि map एक संग्रह में सभी परिणाम जमा करता है, जबकि foreach कुछ भी नहीं देता है map आमतौर पर जब आप एक समारोह के साथ तत्वों का संग्रह बदलना चाहते हैं, जबकि foreach बस प्रत्येक तत्व के लिए एक कार्रवाई कार्यान्वित करता है।

संक्षेप में, foreach तत्वों के संग्रह के प्रत्येक तत्व पर एक ऑपरेशन को लागू करने के लिए है, जबकि map एक संग्रह को दूसरे में बदलने के लिए है

foreach और map बीच दो महत्वपूर्ण अंतर हैं

  1. foreach पास ऑपरेशन पर कोई वैचारिक प्रतिबंध नहीं है, जो कि तर्क के रूप में तत्व को स्वीकार करने के अलावा अन्य। यही है, ऑपरेशन कुछ भी नहीं कर सकता है, एक साइड-इफेक्ट हो सकता है, एक मान लौटा सकता है या कोई मूल्य नहीं लौटा सकता है सभी foreach बारे में परवाह है तत्वों के संग्रह पर पुनरावृत्त है, और प्रत्येक तत्व पर कार्रवाई लागू।

    map , दूसरी ओर, ऑपरेशन पर प्रतिबंध होता है: यह उम्मीद करता है कि आपरेशन एक तत्व वापस करने के लिए, और संभवतः तर्क को तर्क के रूप में भी स्वीकार करते हैं। map ऑपरेशन तत्वों के एक संग्रह पर पुनरावृत्त करता है, प्रत्येक तत्व पर ऑपरेशन को लागू करने और अंत में ऑपरेशन के प्रत्येक आमंत्रण के परिणाम को एक और संग्रह में संग्रहित करता है। दूसरे शब्दों में, map एक संग्रह को दूसरे में बदल देती है

  2. foreach तत्वों के एक संग्रह के साथ काम करता है यह इनपुट संग्रह है

    map तत्वों के दो संग्रहों के साथ काम करता है: इनपुट संग्रह और आउटपुट संग्रह

दो एल्गोरिदम से संबंधित यह कोई गलती नहीं है: वास्तव में, आप दो पदानुक्रमित रूप से देख सकते हैं, जहां map foreach विशेषज्ञता है। यही है, आप foreach उपयोग कर सकते हैं और ऑपरेशन अपने तर्क को बदलने और इसे एक और संग्रह में डालें। इसलिए, foreach एल्गोरिथ्म map एल्गोरिदम का एक अमूर्त, सामान्यीकरण है। वास्तव में, क्योंकि foreach अपने ऑपरेशन पर कोई प्रतिबंध नहीं है हम सुरक्षित रूप से कह सकते हैं कि foreach वहाँ से सबसे सरल लूपिंग तंत्र है, और यह एक पाश कर सकता है कुछ भी कर सकते हैं। map , और साथ ही अन्य विशेष एल्गोरिदम, अभिव्यक्ति के लिए है: यदि आप एक संग्रह को दूसरे में मैप करना चाहते हैं (या ट्रांस्फ़ॉर्म), तो आपका इरादा साफ है यदि आप map उपयोग करते हैं तो आप foreach उपयोग करते हैं

हम इस चर्चा को आगे बढ़ा सकते हैं, और copy एल्गोरिदम पर विचार कर सकते हैं: एक लूप जो संग्रह को क्लोन करता है यह एल्गोरिदम भी foreach एल्गोरिदम का एक foreach है। आप एक ऑपरेशन को परिभाषित कर सकते हैं, जो किसी तत्व को दिया जाता है, वह उसी तत्व को दूसरे संग्रह में सम्मिलित करेगा। यदि आप उस आपरेशन के साथ foreach उपयोग करते हैं, तो आप प्रभाव में copy एल्गोरिथम प्रदर्शन करते हैं, हालांकि कम स्पष्टता, व्यक्तित्व या स्पष्टीकरण के साथ। आइए इसे आगे भी बढ़ाएं: हम यह कह सकते हैं कि map copy एक foreach , जो कि खुद को foreach का एक foreach map किसी भी तत्व को बदल सकता है जो इसे पुनरावृत्त करता है। अगर map किसी भी तत्व को परिवर्तित नहीं करता है तो यह केवल तत्वों की प्रतिलिपि बना रहा है, और प्रति का प्रयोग करने से आशय अधिक स्पष्ट रूप से प्रकट होगा।

भाषा के आधार पर, foreach एल्गोरिदम खुद या रिटर्न मान नहीं हो सकता है सी ++ में, उदाहरण के लिए, foreach मूल रूप से प्राप्त होने वाले ऑपरेशन को देता है। विचार यह है कि आपरेशन में एक राज्य हो सकता है, और आप उस ऑपरेशन को वापस देख सकते हैं कि यह तत्वों के ऊपर कैसे विकसित हुआ है। map , भी, एक मूल्य वापस नहीं या मई। सी ++ transform ( map के बराबर यहाँ) एक इटरेटर को आउटपुट कंटेनर (संग्रह) के अंत में वापस करना होता है। रूबी में, map का रिटर्न वैल्यू आउटपुट अनुक्रम (संग्रह) है। इसलिए, एल्गोरिदम का रिटर्न वैल्यू वास्तव में एक कार्यान्वयन विवरण है; उनका प्रभाव हो सकता है या न हो कि वे क्या लौटें।

Array.protototype.map विधि और Array.protototype.forEach दोनों काफी समान हैं।

निम्न कोड चलाएं: http://labs.codecademy.com/bw1/6#:workspace

 var arr = [1, 2, 3, 4, 5]; arr.map(function(val, ind, arr){ console.log("arr[" + ind + "]: " + Math.pow(val,2)); }); console.log(); arr.forEach(function(val, ind, arr){ console.log("arr[" + ind + "]: " + Math.pow(val,2)); }); 

वे सही परिणाम परिणाम देते हैं।

 arr[0]: 1 arr[1]: 4 arr[2]: 9 arr[3]: 16 arr[4]: 25 arr[0]: 1 arr[1]: 4 arr[2]: 9 arr[3]: 16 arr[4]: 25 

लेकिन जब आप निम्न कोड चलाते हैं तो मोड़ आता है: –

यहां मैंने मैट से रिटर्न वैल्यू का नतीजा दिया है और प्रत्येक तरीके

 var arr = [1, 2, 3, 4, 5]; var ar1 = arr.map(function(val, ind, arr){ console.log("arr[" + ind + "]: " + Math.pow(val,2)); return val; }); console.log(); console.log(ar1); console.log(); var ar2 = arr.forEach(function(val, ind, arr){ console.log("arr[" + ind + "]: " + Math.pow(val,2)); return val; }); console.log(); console.log(ar2); console.log(); 

अब परिणाम कुछ मुश्किल है!

 arr[0]: 1 arr[1]: 4 arr[2]: 9 arr[3]: 16 arr[4]: 25 [ 1, 2, 3, 4, 5 ] arr[0]: 1 arr[1]: 4 arr[2]: 9 arr[3]: 16 arr[4]: 25 undefined 

निष्कर्ष

Array.prototype.map एक सरणी देता है लेकिन Array.prototype.forEach नहीं करता है। तो आप कॉलबैक फ़ंक्शन के अंदर लौटे हुए सरणी को मैप विधि में बदल सकते हैं और फिर इसे वापस कर सकते हैं।

Array.prototype.forEach केवल दिए गए सरणी के माध्यम से चलता है ताकि आप सरणी चलते समय अपना सामान कर सकें।

सबसे 'दृश्यमान' अंतर यह है कि नक्शा नयी संग्रह में परिणाम जमा करता है, जबकि केवल निष्पादन के लिए केवल वहीच किया जाता है।

लेकिन कुछ अतिरिक्त मान्यताओं हैं: चूंकि नक्शे के 'उद्देश्य' मूल्यों की नई सूची है, यह वास्तव में निष्पादन के आदेश को महत्व नहीं देता है। वास्तव में, कुछ निष्पादन वातावरण समानांतर कोड उत्पन्न करते हैं, या कुछ बार कॉल करने से बचने के लिए दोहराए जाने वाले मूल्यों या आलसी के लिए कॉल करने से बचने के लिए कुछ यादों का परिचय भी देते हैं।

दूसरी ओर, बाहरी साइड इफेक्ट्स के लिए विशेष रूप से कहा जाता है; इसलिए क्रम महत्वपूर्ण है, और आमतौर पर समानांतर नहीं किया जा सकता है।

संक्षिप्त जवाब: map और forEach लिए अलग-अलग हैं इसके अलावा, अनौपचारिक रूप से, map लिए एक सख्त सुपरसेट है।

लंबा उत्तर: सबसे पहले, आइए forEach map एक पंक्ति का वर्णन map :

  • forEach प्रत्येक तत्व पर हर forEach पुनरावृत्त, प्रत्येक पर आपूर्ति समारोह बुला।
  • map सभी तत्वों पर पुनरावृत्त करता है, प्रत्येक पर दिए गए फ़ंक्शन को बुलाता है, और प्रत्येक फ़ंक्शन कॉल के परिणाम को याद करके एक बदलकर सरणी का उत्पादन करता है।

कई भाषाओं में, अक्सर each को केवल each को कहा जाता है निम्नलिखित चर्चा केवल संदर्भ के लिए जावास्क्रिप्ट का उपयोग करती है। यह वास्तव में किसी भी अन्य भाषा हो सकती है

अब, इन कार्यों में से प्रत्येक का उपयोग करते हैं।

प्रत्येक के लिए उपयोग:

कार्य 1: एक फ़ंक्शन printSquares लिखें, जो संख्याओं arr की एक सरणी स्वीकार करता है, और इसमें प्रत्येक तत्व के वर्ग को प्रिंट करता है

समाधान 1:

 var printSquares = function (arr) { arr.forEach(function (n) { console.log(n * n); }); }; 

map का उपयोग करना:

टास्क 2: फ़ंक्शन selfDot लिखें, जो संख्याओं की एक सरणी स्वीकार करता है, और एक सरणी देता है जिसमें प्रत्येक तत्व arr में संबंधित तत्व का वर्ग होता है।

एक तरफ: यहाँ, कठबोली शब्दों में, हम इनपुट सरणी को चक्कर लगाने की कोशिश कर रहे हैं। औपचारिक रूप से डालें, हम अपने साथ डॉट उत्पाद की गणना करने का प्रयास कर रहे हैं।

समाधान 2:

 var selfDot = function (arr) { return arr.map(function (n) { return n * n; }); }; 

map किस प्रकार के लिए एक सुपरसेट है?

आप दोनों कार्यों, कार्य 1 और कार्य 2 को हल करने के लिए map का उपयोग कर सकते हैं हालांकि, आप कार्य 2 को हल करने के लिए forEach लिए उपयोग नहीं कर सकते

समाधान 1 में , यदि आप map द्वारा forEach प्रतिस्थापित करते हैं, तो समाधान अभी भी मान्य होगा। समाधान 2 में , हालांकि, प्रत्येक के लिए map बदलकर आपके पहले कार्य समाधान को तोड़ forEach जाएगा।

map संदर्भ में forEach कार्यान्वयन:

map के श्रेष्ठता को साकार करने का एक अन्य तरीका map के संदर्भ में forEach लिए लागू forEach है। जैसा कि हम अच्छे प्रोग्रामर हैं, हम नामस्थान प्रदूषण में शामिल नहीं होंगे। हम अपने लिए कॉल करेंगे each , केवल each

 Array.prototype.each = function (func) { this.map(func); }; 

अब, अगर आपको prototype बकवास पसंद नहीं है, तो आप यहां जाएं:

 var each = function (arr, func) { arr.map(func); // Or map(arr, func); }; 

तो, उम्म .. के लिए क्यों करता है forEach भी अस्तित्व में है?

उत्तर दक्षता है यदि आप एक सरणी को किसी अन्य सरणी में बदलने में कोई दिलचस्पी नहीं रखते हैं, तो आपको रूपांतरण की सरणी क्यों गणना करनी चाहिए? केवल इसे डंप करने के लिए? बिलकूल नही! यदि आप परिवर्तन नहीं करना चाहते हैं, तो आपको कोई परिवर्तन नहीं करना चाहिए।

इसलिए जबकि कार्य 1 का समाधान करने के लिए मानचित्र का उपयोग किया जा सकता है, संभवतः यह नहीं होना चाहिए। प्रत्येक के लिए सही उम्मीदवार है


मूल उत्तर:

जबकि मैं मोटे तौर पर @madlep के उत्तर से सहमत हूं, मुझे पता चलाना है कि map() एक सख्त सुपर-सेट है , forEach()

हां, map() आमतौर पर एक नई सरणी बनाने के लिए उपयोग किया जाता है। हालांकि, वर्तमान सरणी को बदलने के लिए इसका उपयोग भी किया जा सकता है।

यहां एक उदाहरण है:

 var a = [0, 1, 2, 3, 4], b = null; b = a.map(function (x) { a[x] = 'What!!'; return x*x; }); console.log(b); // logs [0, 1, 4, 9, 16] console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"] 

उपरोक्त उदाहरण में, a आसानी से ऐसा सेट किया गया था कि a[i] === i i < a.length के लिए फिर भी, यह map() की शक्ति को दर्शाता है map()

यहां map() का आधिकारिक विवरण है map() ध्यान दें कि map() उस सरणी को भी बदल सकता है जिस पर इसे कहा जाता है! जय हो map()

उम्मीद है कि यह मदद मिलेगी


10-नवंबर 2015 को संपादित: विस्तार जोड़ा गया

यहां स्काला में सूचियों का उपयोग करते हुए एक उदाहरण दिया गया है: नक्शा रिटर्न सूची, परछाई कुछ भी रिटर्न नहीं देता

 def map(f: Int ⇒ Int): List[Int] def foreach(f: Int ⇒ Unit): Unit 

इसलिए नक्शा फ़ंक्शन को प्रत्येक सूची तत्व से लागू करने से परिणाम सूची देता है:

 scala> val list = List(1, 2, 3) list: List[Int] = List(1, 2, 3) scala> list map (x => x * 2) res0: List[Int] = List(2, 4, 6) 

Foreach बस एफ प्रत्येक तत्व के लिए लागू होता है:

 scala> var sum = 0 sum: Int = 0 scala> list foreach (sum += _) scala> sum res2: Int = 6 // res1 is empty 

यदि आप विशेष रूप से जावास्क्रिप्ट के बारे में बात कर रहे हैं, तो अंतर यह है कि map एक पाश समारोह है, जबकि forEach एक इटरेटर है।

map उपयोग map जब आप सूची के प्रत्येक सदस्य को एक ऑपरेशन लागू करना चाहते हैं और मूल सूची को प्रभावित किए बिना, परिणामों को वापस नई सूची के रूप में प्राप्त करना चाहते हैं

प्रत्येक सूची के प्रत्येक तत्व के आधार पर जब आप कुछ करना चाहते हैं, तो प्रत्येक के लिए उपयोग करें। आप पृष्ठ पर चीजों को जोड़ सकते हैं, उदाहरण के लिए। मूल रूप से, जब आप "साइड इफेक्ट्स" चाहते हैं तब यह बहुत अच्छा होता है

अन्य मतभेद: forEach रिटर्न कुछ नहीं (क्योंकि यह वास्तव में एक नियंत्रण प्रवाह कार्य है), और पारित फ़ंक्शन को इंडेक्स और पूरी सूची का संदर्भ मिलता है, जबकि नक्शा नई सूची देता है और केवल वर्तमान तत्व में ही गुजरता है।