জাভাস্ক্রিপ্টে একটি ফাংশন প্যারামিটার হিসাবে একটি অ্যারে পাস করা


289

আমি প্যারামিটার হিসাবে অ্যারে ব্যবহার করে একটি ফাংশন কল করতে চাই:

const x = ['p0', 'p1', 'p2'];
call_me(x[0], x[1], x[2]); // I don't like it

function call_me (param0, param1, param2 ) {
  // ...
}

সেখানে বিষয়বস্তু ক্ষণস্থায়ী একটি ভাল উপায় আছে xমধ্যে call_me()?

উত্তর:


420
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);

এর জন্য MDN ডক্স দেখুন Function.prototype.apply()


যদি পরিবেশটি ECMAScript 6 সমর্থন করে, আপনি পরিবর্তে একটি স্প্রেড যুক্তি ব্যবহার করতে পারেন :

call_me(...args);

9
পার্শ্ব নোট হিসাবে, যদি কেউ এর পরিবর্তে কোনও এসোসিয়েটিভ অ্যারে (নামযুক্ত কীগুলি) পাস করতে চান তবে কোনও বস্তু ব্যবহার করুন। পিএইচপি থেকে আগত (এবং সর্বদা গুগলের মাধ্যমে এই থ্রেডে নিয়ে যায়) এটি বের করতে আমার কিছুটা সময় লেগেছে। আপনি তখন পরামিতি হিসাবে পুরো বস্তুটি পাস করতে পারেন। w3schools.com/js/js_objects.asp
টিমহ্যাক 22

'স্প্রেড' যুক্তি দেখানোর জন্য ধন্যবাদ! এটি সম্পর্কে জানতাম না।
থমাস আন

@ টিটিএমএইচসি - আপনার পাশের নোট মন্তব্যটি আকর্ষণীয়, তবে আমি এটি বিশ্লেষণ করতে পারছি না (আমি বেশ কয়েকটি টিউটোরিয়াল দিয়ে জাভাস্ক্রিপ্ট নুব করছি)। জেএস-তে, বেশ কিছু টিউটোরিয়াল অনুসারে একটি এসোসিয়েটিভ অ্যারে হ'ল একটি অবজেক্ট।
NateT

@ টিএমএইচসি 22, এবং জেএসন অবজেক্টটি কোনও ফাংশনটিতে প্যারামিটার হিসাবে পাস করার সময় আরও ভাল পঠনযোগ্যতার জন্য প্যারামিটার ধ্বংসকে ভুলে যাবেন না
মুহাম্মদ ওমর আসলাম

113

আপনি কেন পুরো অ্যারেটি পাস করে ফাংশনের অভ্যন্তরে প্রয়োজনীয় হিসাবে এটি প্রক্রিয়া করছেন না?

var x = [ 'p0', 'p1', 'p2' ]; 
call_me(x);

function call_me(params) {
  for (i=0; i<params.length; i++) {
    alert(params[i])
  }
}

37
এটি কারণ আমি কল_মেম () পরিবর্তন করতে পারি না। এটি অন্য কয়েকটি লাইব্রেরিতে সংজ্ঞায়িত করা হয়েছে এবং API এর সাথে গোলযোগ করা সম্ভব নয়।
রবার্ট

62
+1 কারণ যদিও এটি আসল প্রশ্নের উত্তর দেয় না, সম্ভবত এই পৃষ্ঠাটি 100K + লোকেরা খুঁজছিল।
ইশিকাওয়া

"কল_মে (এক্স)" লাইনটি কি করছে তা কেউ ব্যাখ্যা করতে পারেন? এটি ফাংশন কীওয়ার্ড ব্যতীত কোনও ফাংশনের নাম বলে মনে হচ্ছে? এটা ঠিক কি করছে?
সাঁতার কাটা

1
@ সোয়াম এটি ফাংশনটির জন্য একটি কল call_me। এটি কেবল শেষে একটি সেমিকোলন অভাব আছে।
সান্টিবাইলર્સ

@ সোয়াম এটি ঘোষিত কল_মেম (প্যারাম) ফাংশন কার্যকর করছে।
জুলিও রডরিগেজ

43

ধরে নিচ্ছি যে কল_মাই একটি বিশ্বব্যাপী ফাংশন, সুতরাং আপনি এটি সেট হয়ে যাওয়ার আশা করবেন না।

var x = ['p0', 'p1', 'p2'];
call_me.apply(null, x);

41

ES6 স্ট্যান্ডার্ডে একটি নতুন স্প্রেড অপারেটর রয়েছে ... যা হুবহু এটি করে।

call_me(...x)

এটি IE বাদে সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত।

স্প্রেড অপারেটর আরও অনেক দরকারী কাজ করতে পারে এবং লিঙ্কযুক্ত ডকুমেন্টেশনগুলি এটি দেখানোর ক্ষেত্রে সত্যই একটি ভাল কাজ করে।



আমি লিঙ্কটি আপডেট করেছি। চিয়ার্স।
জেনোফাইথন

7

@ ক্যাপ্টজনকোল্ড উত্তর হিসাবে দিয়েছিল

var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);

এবং আপনাকে কল_ম ফাংশনের জন্য প্রতিটি পরামিতিগুলি সংজ্ঞায়িত করতে হবে না। আপনি শুধু ব্যবহার করতে পারেনarguments

function call_me () {
    // arguments is a array consisting of params.
    // arguments[0] == 'p0',
    // arguments[1] == 'p1',
    // arguments[2] == 'p2'
}

4
এটি এমন একটি খারাপ অভ্যাস ... আপনি যদি ফাংশনটি দেখেন তবে ফাংশনটির কী প্রয়োজন তা আপনি দেখতে সক্ষম হবেন না এবং প্রতিটি পরামিতিগুলি alচ্ছিক।
রবিন

3

এটি নোট করুন

function FollowMouse() {
    for(var i=0; i< arguments.length; i++) {
        arguments[i].style.top = event.clientY+"px";
        arguments[i].style.left = event.clientX+"px";
    }

};

// ---------------------------

এইচটিএমএল পৃষ্ঠা

<body onmousemove="FollowMouse(d1,d2,d3)">

<p><div id="d1" style="position: absolute;">Follow1</div></p>
<div id="d2" style="position: absolute;"><p>Follow2</p></div>
<div id="d3" style="position: absolute;"><p>Follow3</p></div>


</body>

যে কোনও আরগ সহ ফাংশন কল করতে পারে

<body onmousemove="FollowMouse(d1,d2)">

অথবা

<body onmousemove="FollowMouse(d1)">

এটি পরিষ্কারভাবে উত্তরের অংশ। কল করার পরে অ্যারেটি ফিরে পেতে অবশ্যই "আর্গুমেন্টস" দরকার। ধন্যবাদ!
ফ্লোরিয়ানবি

2

ফাংশন আর্গুমেন্ট এছাড়াও অ্যারে হতে পারে:

function foo([a,b,c], d){
  console.log(a,b,c,d);
}

foo([1,2,3], 4)

অফ কোর্স এক এছাড়াও ব্যবহার করতে পারেন বিস্তার :

function foo(a, b, c, d){
  console.log(a, b, c, d);
}

foo(...[1, 2, 3], 4)


2

স্প্রেড অপারেটরটি ব্যবহার করার সময় আমাদের অবশ্যই এটি লক্ষ্য রাখতে হবে যে এটি অবশ্যই শেষ বা একমাত্র পরামিতিটি পাস হয়েছে। অন্যথায় এটি ব্যর্থ হবে।

function callMe(...arr){ //valid arguments
    alert(arr);
}

function callMe(name, ...arr){ //valid arguments
    alert(arr);
}

function callMe(...arr, name){ //invalid arguments
    alert(arr);
}

আরম্ভের যুক্তি হিসাবে যদি আপনাকে কোনও অ্যারে পাস করতে হয় তবে আপনি এটি করতে পারেন:

function callMe(arr, name){
    let newArr = [...arr];
    alert(newArr);
}

1

আপনি আরও সাধারণ আকারে স্প্রেড অপারেটর ব্যবহার করতে পারেন

[].concat(...array)

ফাংশনগুলির ক্ষেত্রে অ্যারে ফিরিয়ে দেয় তবে আর্গুমেন্ট হিসাবে পাস হবে বলে আশা করা যায়

উদাহরণ:

function expectArguments(...args){
  return [].concat(...args);
}

JSON.stringify(expectArguments(1,2,3)) === JSON.stringify(expectArguments([1,2,3]))

0

উত্তরটি ইতিমধ্যে দেওয়া হয়েছিল, তবে আমি কেবল আমার কেকের টুকরোটি দিতে চাই। আপনি যা অর্জন করতে চান তাকে বলা হয়method borrowing প্রসঙ্গে হয়, যখন আমরা কোনও বস্তুর কাছ থেকে কোনও পদ্ধতি নিই এবং অন্য কোনও বস্তুর প্রসঙ্গে তাকে ডাকি। অ্যারে পদ্ধতি গ্রহণ এবং তাদের আর্গুমেন্টে প্রয়োগ করা খুব সাধারণ বিষয়। আমাকে যদি আপনি একটি উদাহরণ দিতে।

সুতরাং আমাদের কাছে "সুপার" হ্যাশিং ফাংশন রয়েছে যা আর্গুমেন্ট হিসাবে দুটি সংখ্যা নেয় এবং "সুপার নিরাপদ" হ্যাশ স্ট্রিং প্রদান করে:

function hash() {
  return arguments[0]+','+arguments[1];
}

hash(1,2); // "1,2" whoaa

এতদূর ভাল, তবে উপরোক্ত পদ্ধতির সাথে আমাদের সামান্য সমস্যা রয়েছে, এটি সীমাবদ্ধ, কেবল দুটি সংখ্যা নিয়ে কাজ করে, এটি গতিশীল নয়, আসুন এটি কোনও সংখ্যার সাথে কাজ করা যাক এবং আপনাকে কোনও অ্যারে পাস করতে হবে না (আপনি পারেন) আপনি এখনও জেদ থাকলে)। ঠিক আছে, যথেষ্ট আলোচনা, আসুন যুদ্ধ করি!

প্রাকৃতিক সমাধান arr.joinপদ্ধতি ব্যবহার করা হবে :

function hash() {
  return arguments.join();
}

hash(1,2,4,..); //  Error: arguments.join is not a function

ওহ মানুষ. দুর্ভাগ্যক্রমে, এটি কাজ করবে না। কারণ আমরা হ্যাশ (আর্গুমেন্ট) বলছি এবং আর্গুমেন্ট অবজেক্ট উভয়ই পুনরাবৃত্ত এবং অ্যারে-জাতীয়, তবে আসল অ্যারে নয়। নীচের পদ্ধতির সম্পর্কে কীভাবে?

function hash() {
  return [].join.call(arguments);
}

hash(1,2,3,4); // "1,2,3,4" whoaa

কৌতুক বলা হয় method borrowing.

আমরা joinএকটি নিয়মিত অ্যারে থেকে একটি পদ্ধতি ধার করি এবং এর প্রসঙ্গে এটি চালানোর জন্য [].join.ব্যবহার [].join.callকরি arguments

কেন এটি কাজ করে?

এর কারণ স্থানীয় পদ্ধতির অভ্যন্তরীণ অ্যালগরিদম arr.join(glue)খুব সহজ।

স্পেসিফিকেশন থেকে প্রায় "যেমনটি" থেকে নেওয়া:

Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
Do so until this.length items are glued.
Return result.

সুতরাং, প্রযুক্তিগতভাবে এটি এটি নেয় এবং এটি [0], এটি [1]… ইত্যাদি একসাথে যোগদান করে। এটি ইচ্ছাকৃতভাবে এমনভাবে লেখা হয়েছে যাতে কোনও অ্যারের মতো (কোনও কাকতালীয় নয়, অনেকগুলি পদ্ধতি এই অনুশীলনটি অনুসরণ করে) মঞ্জুরি দেয়। এজন্য এটিও কাজ করেthis=arguments.

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