जावास्क्रिप्ट में फ़ंक्शन पैरामीटर के रूप में एक सरणी पास करना


291

मैं एक सरणी को मापदंडों के रूप में उपयोग करके फ़ंक्शन को कॉल करना चाहूंगा:

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()?

जवाबों:


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

के लिए MDN डॉक्स देखें Function.prototype.apply()


यदि पर्यावरण ECMAScript 6 का समर्थन करता है, तो आप इसके बजाय प्रसार तर्क का उपयोग कर सकते हैं :

call_me(...args);

9
एक साइड नोट के रूप में, यदि कोई इसके बजाय एक सहयोगी सरणी (नाम की चाबियाँ) पास करना चाहता है, तो किसी ऑब्जेक्ट का उपयोग करें। PHP से आ रहा है (और हमेशा गूगल द्वारा इस धागे का नेतृत्व किया) मुझे यह पता लगाने में थोड़ा समय लगा। आप पूरे ऑब्जेक्ट को एक पैरामीटर के रूप में तब पास कर सकते हैं। w3schools.com/js/js_objects.asp
timhc22

'प्रसार' तर्क को इंगित करने के लिए धन्यवाद! इसके बारे में पता नहीं था।
थॉमस एन

@timhc - आपकी साइड नोट टिप्पणी पेचीदा है, लेकिन मैं इसे पार्स नहीं कर सकता (मैं एक जावास्क्रिप्ट काम कर रहा हूँ ट्यूटोरियल के एक जोड़े के साथ काम कर रहा हूँ)। जे एस में, एक साहचर्य सरणी है कई ट्यूटोरियल के अनुसार एक वस्तु।
NateT

@ timhc22, और जब किसी फ़ंक्शन के पैरामीटर के रूप में पास होने के लिए json ऑब्जेक्ट का उपयोग करते हैं, तो बेहतर पठनीयता के लिए पैरामीटर डिस्ट्रक्शन को न भूलें
मुहम्मद उमर असलम

113

आप पूरे एरे को पास क्यों नहीं करते और इसे फंक्शन के अंदर आवश्यकतानुसार प्रोसेस करते हैं?

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

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

37
ऐसा इसलिए है क्योंकि मैं call_me () को संशोधित नहीं कर सकता। इसे कुछ अन्य लाइब्रेरी में परिभाषित किया गया है और एपीआई के साथ खिलवाड़ करना संभव नहीं है।
रॉबर्ट

62
+1 क्योंकि यह मूल प्रश्न का उत्तर नहीं देता है, इसलिए संभवतः यह 100K + लोग हैं जो इस पृष्ठ को देख रहे थे।
इशीकावा

क्या कोई समझा सकता है कि "call_me (x)" लाइन क्या कर रही है? ऐसा लगता है जैसे यह फ़ंक्शन कीवर्ड के बिना एक फ़ंक्शन नाम है? वास्तव में यह क्या कर रहा है?
लपेटे हुए

1
@swam यह call_meफ़ंक्शन के लिए एक कॉल है । यह अंत में एक अर्धविराम की कमी है।
शांतिबेल

@swam यह घोषित call_me (params) फ़ंक्शन के निष्पादन में लगा रहा है।
जूलियो रोड्रिग्ज

43

यह मानते हुए कि call_me एक वैश्विक फ़ंक्शन है, इसलिए आप इसे सेट करने की अपेक्षा नहीं करते हैं।

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

41

ईएस 6 मानक में एक नया प्रसार ऑपरेटर ... होता है जो ठीक यही करता है।

call_me(...x)

यह IE को छोड़कर सभी प्रमुख ब्राउज़रों द्वारा समर्थित है।

स्प्रेड ऑपरेटर कई अन्य उपयोगी चीजें कर सकता है, और लिंक किए गए प्रलेखन को दिखाने पर वास्तव में अच्छा काम होता है।



7

जैसा @KaptajnKold ने उत्तर दिया था

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

और आपको call_me फ़ंक्शन के लिए हर पैरामीटर को परिभाषित करने की आवश्यकता नहीं है। आप बस इस्तेमाल कर सकते हैंarguments

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

4
यह ऐसी बुरी प्रथा है ... आप यह देखने में सक्षम नहीं होंगे कि फ़ंक्शन को क्या चाहिए और यदि आप फ़ंक्शन को देखते हैं तो हर पैरामीटर वैकल्पिक है।
रॉबिन

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";
    }

};

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

html पेज

<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.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.