2012-06-03 16 views
6

मैं एक ऐसे फ़ंक्शन के साथ जेएस की Array.prototype.map() कार्यक्षमता का उपयोग करने का एक तरीका ढूंढने का प्रयास कर रहा हूं जिसमें एक अतिरिक्त पैरामीटर अधिक है (यदि संभव हो तो, और मुझे पसंद है से Array.prototype.map() को फिर से लिखने के लिए) से बचें। यह प्रलेखन बहुत अच्छा है, लेकिन "एक या अधिक-अतिरिक्त पैरामीटर" मामले को कवर नहीं करता:जेएस कॉलबैक एक फ़ंक्शन के साथ मानचित्र() का उपयोग करके एक अतिरिक्त पैरामीटर

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

function doOpSingle(elem) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var x = A.map(doOpSingle); // this will execute doOpSingle() on each array element 

अब तक तो अच्छा। लेकिन क्या होगा यदि प्रश्न में कार्य दो पैरामीटर है, जैसे ई। जी। एक झंडा आप के लिए या इसे करने के लिए चाहते हो सकता है, (बिट मास्क के बारे में सोच)

function doOpSingle2(arrelem,flag) 
{ 
// do something with one array element 
} 

var A = ["one", "two", "three", "four"]; 
var theFlag = util.getMask(); // call external function 
var y = A.map(doOpSingle2(theFlag)); // this does not work! 

कोई समाधान निश्चित रूप सेfor छोरों के बिना करना चाहिए, क्योंकि इसी वजह से हमने map() है, हमारे कोड क्लीनर डब्ल्यू बनाने के लिए है/हो रही इन से छुटकारा पाएं!

A.map(function(a) {return doOpSingle2(a,theFlag);}); 

उत्तर

17

एक गुमनाम समारोह का उपयोग करें।

function doOpSingle2(flag, elem) { ... }

+0

+1, मेरा उत्तर पोस्ट करने के बाद एहसास हुआ :) – SuperSaiyan

+0

टाई! यह संभवतः इस कार्य को कवर करने का एकमात्र तरीका होगा (बाध्य() के अलावा)। अन्य उत्तरदाताओं के लिए भी धन्यवाद। – syntaxerror

1

एक गुमनाम समारोह का उपयोग करें:

15

A.map(doOpSingle2.bind(null, theFlag))

theFlag पहला तर्क रहेगा जिस कोई बात नहीं, आप वास्तव में इस के लिए बंद की जरूरत नहीं है। Esailija का जवाब देखें।

यदि आप Closure library का उपयोग कर रहे हैं तो एक और विकल्प है।

function doOpSingle2(flag, arrelem) 
{ 
// do something with one array element 
} 

तो आप

var y = A.map(goog.partial(doOpSingle2, theFlag)); 

goog.partial आंशिक रूप से लागू होता है समारोह सकते हैं, इसलिए goog.partial(doOpSingle2, theFlag) इस समारोह के बराबर है: सबसे पहले आप doOpSingle2 के पुनर्लेखन के लिए इतना है कि झंडा पहले है

function(arrElem) { 
    return doOpSingle2(theFlag, arrElem); 
} 

इस विशेष मामले में, शायद मैं इस दृष्टिकोण की अनुशंसा नहीं करता, लेकिन ऐसी स्थिति भी हो सकती है जहां यह अच्छी तरह से काम करता है।

+0

इस बाइंड() तकनीक से प्यार है, धन्यवाद! – syntaxerror

1

संपादित करें::

var y = A.map(function(x){doOpSingle2(x,theFlag);}); 
+1

जावास्क्रिप्ट पहले से ही '.bind' के साथ करीबी कर सकता है हालांकि – Esailija

+0

यह बहुत समस्या है। यह थोड़ी सी समस्या के लिए बाहरी पुस्तकालय का उपयोग करने के लिए बहुत अधिक होगा। लेकिन फिर भी, इस दृष्टिकोण के लिए वैसे भी धन्यवाद। _real_ बड़ी प्रोजेक्ट में, मुझे किसी दिन इस तकनीक की आवश्यकता हो सकती है। ;) – syntaxerror

+0

यही कारण है कि मैंने कहा, "यदि आप अभी कुछ भी छोड़ना चाहते हैं और क्लोजर का उपयोग शुरू करना चाहते हैं तो" अगर आप क्लोजर का उपयोग करना चाहते हैं "[कुछ लोग करते हैं] (http://meta.stackexchange.com/a/ 1 9 4 9 2/65 9 77);)। – MatrixFrog

संबंधित मुद्दे