मैं जावास्क्रिप्ट फ़ंक्शन .filter () पद्धति में कॉलबैक फ़ंक्शन के लिए एक अतिरिक्त पैरामीटर कैसे पास करूं?


104

मैं एक स्ट्रिंग में दिए गए स्ट्रिंग के साथ प्रत्येक स्ट्रिंग की तुलना करना चाहता हूं। मेरा वर्तमान कार्यान्वयन है:

function startsWith(element) {
    return element.indexOf(wordToCompare) === 0;
}
addressBook.filter(startsWith);

यह सरल फ़ंक्शन काम करता है, लेकिन केवल इसलिए कि अभी वर्डटॉमपार्क को एक वैश्विक चर के रूप में सेट किया जा रहा है, लेकिन निश्चित रूप से मैं इससे बचना चाहता हूं और इसे एक पैरामीटर के रूप में पारित करता हूं। मेरी समस्या यह है कि मुझे यकीन नहीं है कि startWith () को कैसे परिभाषित किया जाए, इसलिए यह एक अतिरिक्त पैरामीटर को स्वीकार करता है, क्योंकि मैं वास्तव में यह नहीं समझता कि डिफ़ॉल्ट पैरामीटर इसे कैसे लेते हैं। मैंने उन सभी अलग-अलग तरीकों की कोशिश की है जिनके बारे में मैं सोच सकता हूं और उनमें से कोई भी काम नहीं करेगा।

यदि आप यह भी बता सकते हैं कि कॉलबैक फ़ंक्शंस में निर्मित पैमानों को 'सॉरी' कैसे कहा जाता है (क्षमा करें, तो मुझे इनसे बेहतर पद का पता नहीं है)

जवाबों:


152

किसी फ़ंक्शन केstartsWith विरुद्ध तुलना करने और फिर से फ़िल्टर / कॉलबैक फ़ंक्शन के रूप में उपयोग करने के लिए शब्द को स्वीकार करें :

function startsWith(wordToCompare) {
    return function(element) {
        return element.indexOf(wordToCompare) === 0;
    }
}

addressBook.filter(startsWith(wordToCompare));

एक अन्य विकल्प का उपयोग करना होगा Function.prototype.bind [MDN] (केवल ECMAScript 5 का समर्थन करने वाले ब्राउज़र में उपलब्ध है, पुराने ब्राउज़रों के लिए एक शिम का लिंक का पालन करें) और पहले तर्क को "ठीक" करें:

function startsWith(wordToCompare, element) {
    return element.indexOf(wordToCompare) === 0;
}

addressBook.filter(startsWith.bind(this, wordToCompare));

मैं वास्तव में यह नहीं समझता कि डिफ़ॉल्ट पैरामीटर इसे कैसे लेता है

इसके बारे में कुछ खास नहीं है। कुछ बिंदु पर, filterबस कॉलबैक कॉल करता है और सरणी के वर्तमान तत्व को पास करता है। तो यह एक फ़ंक्शन है जो दूसरे फ़ंक्शन को कॉल करता है, इस मामले में कॉलबैक आप तर्क के रूप में पास करते हैं।

यहाँ एक समान कार्य का एक उदाहरण दिया गया है:

function filter(array, callback) {
    var result = [];
    for(var i = 0, l = array.length; i < l; i++) {
        if(callback(array[i])) {  // here callback is called with the current element
            result.push(array[i]);
        }
    }
    return result;
}

1
ठीक है अब मैं समझ गया। मैं कॉलबैक फ़ंक्शन में सीधे मापदंडों को पारित करने की कोशिश कर रहा था ... मुझे वास्तव में अपने जावास्क्रिप्ट पर काम करने की आवश्यकता है। धन्यवाद फेलिक्स, आपका उत्तर बहुत मददगार है
Agente_secreto

अतिरिक्त तर्कों को पारित करने के बारे में क्या? मैं तर्क की एक सरणी गुजर की कोशिश की, लेकिन वह असफल रहा है
geotheory

@geotheory: उनके बारे में क्या? आप किसी अन्य फ़ंक्शन की तरह कई तर्क पास करते हैं।
फेलिक्स क्लिंग

फ़िल्टर के साथ फ़ंक्शन नाम के बाद बाइंड (यह) चैनिंग ने मुझे फ़ंक्शन के अंदर .this का उपयोग करने में मदद की। धन्यवाद।
सागर खत्री

108

फिल्टर का दूसरा पैरामीटर सेट हो जाएगा इस कॉलबैक के अंदर।

arr.filter(callback[, thisArg])

तो आप कुछ ऐसा कर सकते हैं:

function startsWith(element) {
    return element.indexOf(this) === 0;
}
addressBook.filter(startsWith, wordToCompare);

7
मैंने पाया कि यह सबसे अच्छा जवाब है।
जेफ गिल्बर्ट

तो अब नए सरणी को wordToCompare ऑब्जेक्ट को सौंपा जाएगा, है ना? बाद में wordToCompare ऑब्जेक्ट का उपयोग करके नए एरे को कैसे एक्सेस कर सकते हैं?
बधोन जैन

सबसे बढ़िया उत्तर। दोनों फिल्टर और खोजने के लिए एकदम सही काम करता है। और दोनों के लिए WC3 दस्तावेज़ीकरण के अनुसार है: thisValue - वैकल्पिक। फ़ंक्शन को पास करने के लिए एक मान को इसके "इस" मान के रूप में उपयोग करने के लिए। यदि यह पैरामीटर खाली है, तो मान "अपरिभाषित" को इसके "मान" के रूप में पारित किया जाएगा
ऋचा

1
@TarekEldeeb बस आपके द्वारा बनाई गई एक वस्तु को पास करें{one: 'haha', two:'hoho'}
toddmo

2
यह इस बात का एक बड़ा उदाहरण है कि जटिलता के रूप में उत्तरों के बीच बड़े अंतर कैसे हो सकते हैं और वे कितने जटिल हो सकते हैं बनाम वे कितने सरल हो सकते हैं
toddmo

13

तीर कार्यों का उपयोग करके ES6 विकल्प की तलाश करने वालों के लिए, आप निम्न कार्य कर सकते हैं।

let startsWith = wordToCompare => (element, index, array) => {
  return element.indexOf(wordToCompare) === 0;
}

// where word would be your argument
let result = addressBook.filter(startsWith("word"));

अद्यतन संस्करण का उपयोग कर शामिल हैं :

const startsWith = wordToCompare => (element, index, array) => {
  return element.includes(wordToCompare);
}

तत्व, सूचकांक और सरणी से एक अलग पैरामीटर पारित करने का कोई तरीका है? उदाहरण के लिए, मैं एक एक्स चर पारित करना चाहता हूं।
leandrotk

@leandrotk इस मामले में "wordToCompare" पास होने वाला "X" वैरिएबल है।
GetBackerZ


4

आप एक फिल्टर के अंदर तीर फ़ंक्शन का उपयोग कर सकते हैं, जैसे:

result = addressBook.filter(element => element.indexOf(wordToCompare) === 0);

MDN पर एरो फ़ंक्शंस

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


नोट: IE पर समर्थित नहीं
लुइस लवेरी

1

किसी को भी आश्चर्य हो रहा है कि उनके फैट एरो फंक्शन की अनदेखी क्यों हो रही है [, thisArg] क्यों हो , जैसे कि क्यों

["DOG", "CAT", "DOG"].filter(animal => animal === this, "DOG") रिटर्न []

ऐसा इसलिए है क्योंकि thisफ़ंक्शन के निर्माण के दौरान उन एरो फ़ंक्शंस बंधे होते हैं और thisव्यापक दायरे में मान पर सेट होते हैं , इसलिए thisArgतर्क की अनदेखी की जाती है। मुझे एक पेरेंट स्कोप में एक नया वैरिएबल घोषित करके यह बहुत आसानी से मिल गया:

let bestPet = "DOG"; ["DOG", "CAT", "DOG"].filter(animal => animal === bestPet); => ["DOG", "DOG"]

यहाँ कुछ और पढ़ने का लिंक दिया गया है: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this


0

विषम उत्तर पर आधारित और https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

मैंने इसे 2 अलग तरीके से किया। 1) फ़ंक्शन तरीके का उपयोग करना। 2) इनलाइन तरीके का उपयोग करना।

//Here  is sample codes : 

var templateList   = [
{ name: "name1", index: 1, dimension: 1 }  ,
{ name: "name2", index: 2, dimension: 1 }  ,
{ name: "name3", index: 3, dimension: 2 }  ];


//Method 1) using function : 

function getDimension1(obj) {
                if (obj.dimension === 1) // This is hardcoded . 
                    return true;
                else return false;
            } 

var tl = templateList.filter(getDimension1); // it will return 2 results. 1st and 2nd objects. 
console.log(tl) ;

//Method 2) using inline way 
var tl3 = templateList.filter(element => element.index === 1 || element.dimension === 2  ); 
// it will return 1st and 3rd objects 
console.log(tl3) ;


0

फ़िल्टर फ़ंक्शन का उपयोग करने का एक आसान तरीका है, सभी पैरामेट्स तक पहुंचें, और इसे जटिल न करें।

जब तक कॉलबैक का यह आॅर्ग एक और स्कोप फिल्टर पर सेट नहीं हो जाता है , तब तक इसका स्वयं का स्कोप नहीं बनता है, और हम करंट स्कोम के दायरे में पहुंच सकते हैं। यदि आवश्यक हो तो अन्य मानों को एक्सेस करने के लिए हम एक अलग दायरे को परिभाषित करने के लिए इसे 'सेट' कर सकते हैं, लेकिन डिफ़ॉल्ट रूप से इसे उस स्कोप पर सेट किया जाता है, जहां से इसे बुलाया जाता है। आप देख सकते हैं इस कोणीय कार्यक्षेत्रों के लिए इस्तेमाल किया जा रहा इस ढेर में

IndexOf का उपयोग फ़िल्टर के उद्देश्य को हरा रहा है, और अधिक उपरि जोड़ रहा है। फ़िल्टर पहले से ही सरणी से गुजर रहा है, इसलिए हमें फिर से इसके माध्यम से पुनरावृति करने की आवश्यकता क्यों है? हम इसके बजाय इसे एक सरल शुद्ध कार्य बना सकते हैं

यहां प्रतिक्रिया-वर्ग विधि के भीतर उपयोग-मामला परिदृश्य है, जहां राज्य में आइटम नामक एक सरणी है , और फ़िल्टर का उपयोग करके हम मौजूदा डेटा की जांच कर सकते हैं:

checkList = (item) => {  // we can access this param and globals within filter
  var result = this.state.filter(value => value === item); // returns array of matching items

  result.length ? return `${item} exists` : this.setState({
    items: items.push(item) // bad practice, but to keep it light
  });
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.