জাভাস্ক্রিপ্ট। ফিল্টার () পদ্ধতিতে আমি কীভাবে কলব্যাক ফাংশনটিতে অতিরিক্ত পরামিতিটি পাস করব?


104

আমি একটি অ্যারেতে প্রতিটি স্ট্রিংকে একটি প্রদত্ত স্ট্রিংয়ের সাথে তুলনা করতে চাই। আমার বর্তমান বাস্তবায়নটি হ'ল:

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

এই সাধারণ ফাংশনটি কাজ করে, তবে কেবলমাত্র এখনই ওয়ার্ড টোকম্পারে একটি বৈশ্বিক পরিবর্তনশীল হিসাবে সেট করা হচ্ছে তবে অবশ্যই আমি এড়াতে এবং এটি একটি পরামিতি হিসাবে পাস করতে চাই। আমার সমস্যাটি হ'ল আমি কীভাবে শুরুগুলি সংজ্ঞায়িত করব তা নিশ্চিত নই ( তাই ) এটি একটি অতিরিক্ত পরামিতি গ্রহণ করে, কারণ এটি গ্রহণ করা ডিফল্ট প্যারামিটারগুলি কীভাবে পাস হয় তা আমি সত্যিই বুঝতে পারি না। আমি ভাবতে পারে এমন বিভিন্ন উপায়ে চেষ্টা করেছি এবং সেগুলির কোনওটিই কাজ করে না।

যদি আপনি কীভাবে কলব্যাক ফাংশনগুলিতে 'অন্তর্নির্মিত' প্যারামিটারগুলি ব্যাখ্যা করতে পারেন (দুঃখিত, আমি এর জন্য আরও ভাল শব্দটি জানি না) যে কাজটি দুর্দান্ত হবে

উত্তর:


152

startsWithশব্দটির সাথে তুলনা করতে গ্রহণ করুন এবং কোনও ফাংশন ফিরিয়ে দিন যা ফিল্টার / কলব্যাক ফাংশন হিসাবে ব্যবহৃত হবে:

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

addressBook.filter(startsWith(wordToCompare));

অন্য বিকল্পটি Function.prototype.bind হ'ল [এমডিএন] ব্যবহার করা (শুধুমাত্র ব্রাউজারে 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
ঠিক আছে এখন আমি বুঝতে পেরেছি। আমি পরামিতিগুলি সরাসরি কলব্যাক ফাংশনে পাস করার চেষ্টা করছিলাম ... আমার জাভাস্ক্রিপ্টটিতে সত্যই আমার কাজ করা দরকার। ধন্যবাদ ফেলিক্স, আপনার উত্তরটি খুব সহায়ক
এজেন্ট_সেক্রেটো

অতিরিক্ত যুক্তি পাস সম্পর্কে কি? আমি যুক্তিগুলির একটি অ্যারে পাশ করার চেষ্টা করেছি তবে এটি ব্যর্থ বলে মনে হচ্ছে
ভূগোলিক

@ জিওথোরি: তাদের কী হবে? আপনি অন্য কোনও ফাংশনের মতো একাধিক যুক্তি পাস করেন।
ফেলিক্স ক্লিং

ফিল্টার () চেইনিংয়ের সাথে ফাংশন নামের পরে বাঁধুন (এটি) বাঁধাই আমাকে ফাংশনটির ভিতরে ব্যবহার করতে সহায়তা করেছিল। ধন্যবাদ।
সাগর খাতরী

108

ফিল্টারের দ্বিতীয় প্যারামিটারটি সেট হবে এই কলব্যাক ভেতরে।

arr.filter(callback[, thisArg])

সুতরাং আপনি যেমন কিছু করতে পারে:

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

7
আমি পেয়েছি এটি সেরা উত্তর।
জিফ গিলবার্ট

সুতরাং এখন নতুন অ্যারেটি টুকম্পের অবজেক্টে বরাদ্দ করা হবে, তাই না? কীভাবে পরে টোকোকম্পের অবজেক্টটি ব্যবহার করে নতুন অ্যারে অ্যাক্সেস করতে পারবেন?
বাদোন জৈন

সর্বোত্তম উত্তর. উভয় ফিল্টার এবং সন্ধান জন্য নিখুঁত কাজ করে। এবং উভয়ের জন্য ডাব্লুসি 3 ডকুমেন্টেশন অনুসারে: এই ভ্যালু - ptionচ্ছিক। তার "এই" মান হিসাবে ব্যবহার করতে ফাংশনে পাস করার জন্য একটি মান। যদি এই প্যারামিটারটি খালি থাকে তবে "
অপরিজ্ঞাত

1
@TarekEldeeb শুধু একটি বস্তু আপনি করতে পাস{one: 'haha', two:'hoho'}
toddmo

2
জটিলতার বিষয়ে উত্তরের মধ্যে কীভাবে বিস্তর পার্থক্য থাকতে পারে এবং তারা কতটা সহজ হতে পারে তার
ভারসাম্য

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" হ'ল "এক্স" ভেরিয়েবলটি in পাস করতে হবে
getBackerZ


4

আপনি ফিল্টারটির মধ্যে তীর ফাংশনটি ব্যবহার করতে পারেন:

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

এমডিএন-এ তীর ফাংশন

একটি তীর ফাংশন এক্সপ্রেশন ফাংশন এক্সপ্রেশনগুলির তুলনায় একটি সংক্ষিপ্ত বাক্য গঠন করে এবং বর্ণটি এই মানটিকে সংক্ষিপ্তভাবে বেঁধে রাখে (এর নিজস্ব, এটি যুক্তি, সুপার বা new.target আবদ্ধ করে না)। তীর ফাংশন সবসময় বেনামে থাকে। এই ফাংশন এক্সপ্রেশনটি নন-মেথড ফাংশনের জন্য সবচেয়ে উপযুক্ত এবং এগুলি কনস্ট্রাক্টর হিসাবে ব্যবহার করা যায় না।


দ্রষ্টব্য: আইই
লুইস লাভেরি

1

যে কারও জন্য ভেবে দেখা যায় যে কেন তাদের ফ্যাটযুক্ত তীর ফাংশনটি এড়ানো হচ্ছে [, thisArg], যেমন

["DOG", "CAT", "DOG"].filter(animal => animal === this, "DOG") আয় []

এর কারণ thisthose তীর ফাংশনের অভ্যন্তরে যখন ফাংশনটি তৈরি করা হয় এবং thisবিস্তৃত পরিবেষ্টনের সুযোগের মান হিসাবে সেট করা থাকে , তাই thisArgযুক্তি উপেক্ষা করা হয়। আমি প্যারেন্ট স্কোপটিতে একটি নতুন ভেরিয়েবল ঘোষণা করে খুব সহজেই এটি পেতে পারি:

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

এখানে আরও কিছু পড়ার লিঙ্ক রয়েছে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / ফাংশনস / অ্যারো_ফিউশনস # না_সেপারাটি_এই


0

অডআরভেন উত্তর এবং https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অ্যারে / ফিল্টার উপর ভিত্তি করে

আমি এটি 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

ফিল্টার ফাংশনটি ব্যবহার করার, সমস্ত প্যারামগুলি অ্যাক্সেস করার, এবং এটি জটিল করে তোলার সহজ উপায় নেই।

কলব্যাকের এইআর্গটি অন্য স্কোপ ফিল্টারে সেট না করা না থাকলে ফিল্টার নিজস্ব স্কোপ তৈরি করে না এবং আমরা বর্তমান স্কোপের মধ্যে প্যারামগুলি অ্যাক্সেস করতে পারি। প্রয়োজনে অন্যান্য মানগুলি অ্যাক্সেস করার জন্য আমরা একটি পৃথক স্কোপ সংজ্ঞায়িত করতে 'এটি' সেট করতে পারি, তবে ডিফল্টরূপে এটি এখান থেকে ডাকা স্কোপে সেট করা থাকে। আপনি দেখতে পারেন এই কৌণিক সুযোগ জন্য ব্যবহৃত হচ্ছে এই স্ট্যাকের মধ্যে

ইনডেক্সফ ব্যবহার করে ফিল্টারের উদ্দেশ্যকে পরাস্ত করে এবং আরও ওভারহেড যুক্ত করে। ফিল্টার ইতিমধ্যে অ্যারের মধ্য দিয়ে চলছে, সুতরাং কেন আমাদের এটির মাধ্যমে আবার পুনরাবৃত্তি করা দরকার? পরিবর্তে আমরা এটিকে একটি সহজ খাঁটি ফাংশন করতে পারি

এখানে প্রতিক্রিয়া শ্রেণি পদ্ধতিতে রাজ্যের আইটেম নামে একটি অ্যারে রয়েছে এবং ফিল্টার ব্যবহার করে আমরা বিদ্যমান রাষ্ট্রটি যাচাই করতে পারি within

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
  });
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.