जावास्क्रिप्ट में कई मान लौटाएँ?


844

मैं जावास्क्रिप्ट में दो मान लौटाने की कोशिश कर रहा हूं । क्या यह संभव है?

var newCodes = function() {  
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return dCodes, dCodes2;
};

आप कॉलबैक का उपयोग करके इसे हल कर सकते हैं, यदि आप ऐसा करने के लिए तैयार हैं, तो मेरा उत्तर देखें। लोग भूल जाते हैं कि आप जेएस के साथ आसानी से "कई मूल्यों को वापस कर सकते हैं", टुपल्स या यहां तक ​​कि: कॉलबैक का उपयोग करते हुए!
अलेक्जेंडर मिल्स

16
उत्तर पुराने हैं। यह अब संभव है। 2ality.com/2014/06/es6-multiple-return-values.html
सहगल-हलेवी

3
आप तकनीकी रूप से अभी भी एक ही वस्तु / सरणी को लौटा रहे हैं, यह सिर्फ डिकंस्ट्रक्शन है जो ES6 में सरल है।
एंड्रिया बर्गांज़ो

जवाबों:


1294

नहीं, लेकिन आप अपने मूल्यों से युक्त एक सरणी लौटा सकते हैं:

function getValues() {
    return [getFirstValue(), getSecondValue()];
}

तब आप उन्हें इस तरह एक्सेस कर सकते हैं:

var values = getValues();
var first = values[0];
var second = values[1];

नवीनतम ECMAScript 6 सिंटैक्स * के साथ, आप रिटर्न मूल्य को अधिक सहजता से नष्ट भी कर सकते हैं:

const [first, second] = getValues();

यदि आप दिए गए मानों (प्रत्येक को बनाए रखने में आसान) पर "लेबल" लगाना चाहते हैं, तो आप एक वस्तु लौटा सकते हैं:

function getValues() {
    return {
        first: getFirstValue(),
        second: getSecondValue(),
    };
}

और उन तक पहुँचने के लिए:

var values = getValues();
var first = values.first;
var second = values.second;

या ES6 सिंटैक्स के साथ:

const {first, second} = getValues();

* ब्राउज़र संगतता के लिए यह तालिका देखें । मूल रूप से, IE से अलग सभी आधुनिक ब्राउज़र इस सिंटैक्स का समर्थन करते हैं, लेकिन आप ES6 कोड को आईईएल-संगत जावास्क्रिप्ट पर संकलित कर सकते हैं जैसे कि बाबेल जैसे उपकरणों के साथ ।


151
या आप किसी ऑब्जेक्ट को वापस कर सकते हैं: return {dCodes : dCodes, dCodes2 : dCodes2};संदर्भ को आसान बनाने के लिए।
इंटेलेक्चुअल

10
आप एक वस्तु को वापस भी कर सकते हैं {: dCodes: dCodes, dCodes2: dCodes2} कार्यात्मक रूप से एक ही लेकिन जब आप अपनी लौटाई गई वस्तु का संदर्भ देते हैं तो आपके पास obj.dCodes और obj.dCh2 बनाम obj [0] और obj [1] के रूप में थोड़ा अधिक पठनीय कोड होता है। ]
जोनाथन एस

1
@alexela निश्चित रूप से आप बस var dCodes = newCodes ()। dCodes का उपयोग कर सकते हैं; var dCodes2 = newCodes ()। dCodes2 हालाँकि, आप फ़ंक्शन को दो बार कॉल करेंगे जो कि जटिल होने पर संसाधनों की बर्बादी हो सकती है।
वादिम किरिलचुक

12
@VadimKirilchuk को विनाशकारी असाइनमेंट के साथ दो बार कॉल करने की आवश्यकता नहीं है - पूर्व। const { dCodes, dCodes2 } = newCodes();
टेलर एड्मिस्टन

7
जैसा कि अन्य उत्तर में कहा गया है (और टिप्पणी निहित है), ES6 यहां कुछ विकल्प लाता है। 3 सटीक होना: (1) ऑब्जेक्ट प्रॉपर्टी शॉर्टहैंड return {dCodes, dCodes2} केवल @Intelekshual के समान काम करती है और (2) एक ही फ़ंक्शन का उपयोग करके आप उन्हें विनाशकारी सरणियों [dCodes, dCodes2] = newCodes()या (3) ऑब्जेक्ट्स के साथ एक्सेस कर सकते हैं ({dCodes, dCodes2} = newCodes())(वहां एक घोषणा का उपयोग करने की आवश्यकता नहीं है ) , हालांकि varवर्तमान साशा के उदाहरण के लिए अधिक उपयुक्त होगा)।
cregox

241

आप "विनाशकारी असाइनमेंट" का उपयोग करके जावास्क्रिप्ट 1.7 से आगे कर सकते हैं । ध्यान दें कि ये पुराने जावास्क्रिप्ट संस्करणों में उपलब्ध नहीं हैं (अर्थ - न तो ECMAScript 3 या 5 वें संस्करण के साथ)।

यह आपको एक साथ 1+ चर प्रदान करने की अनुमति देता है:

var [x, y] = [1, 2];
x; // 1
y; // 2

// or

[x, y] = (function(){ return [3, 4]; })();
x; // 3
y; // 4

आप ऑब्जेक्ट वैल्यू शॉर्टहैंड के साथ संयुक्त ऑब्जेक्ट विनाशकारी का उपयोग किसी ऑब्जेक्ट में रिटर्न वैल्यू को नाम देने के लिए कर सकते हैं और जो आप चाहते हैं उसे बाहर निकाल सकते हैं:

let {baz, foo} = (function(){ return {foo: 3, bar: 500, baz: 40} })();
baz; // 40
foo; // 3

और वैसे, इस तथ्य से मूर्ख मत बनो कि ECMAScript आपको अनुमति देता है return 1, 2, ...। वास्तव में वहाँ क्या होता है, ऐसा नहीं लगता। रिटर्न स्टेटमेंट में एक अभिव्यक्ति - 1, 2, 3- कुछ भी नहीं है, लेकिन एक अल्पविराम ऑपरेटर 1, संख्यात्मक शाब्दिक ( 2और, 3) क्रमिक रूप से लागू होता है , जो अंततः इसकी अंतिम अभिव्यक्ति के मूल्य का मूल्यांकन करता है - 3। यही कारण return 1, 2, 3है कि कार्यात्मक रूप से अधिक लेकिन कुछ भी नहीं के समान है return 3

return 1, 2, 3;
// becomes
return 2, 3;
// becomes
return 3;

1
पिछले उदाहरण के बारे में अजीब और दिलचस्प बात यह है: एक के लिए function foo(){return 1,2,3;}कर रही है console.log([].push(foo()))बाहर प्रिंट 1.
मेरेडिथ

@ औरेलियोनोम्स मुझे बाद में पता चला। साभार
मेरेडिथ

1
क्यों var [x, y] = [1, 2]; एक्स; // 1 y; // 2 यह क्रोम में काम नहीं करता है? त्रुटि उठाना; संदर्भ संदर्भ: असाइनमेंट में अमान्य बाएं हाथ
नवीन अग्रवाल

1
Chrome v49 एक सप्ताह पहले "विनाशकारी असाइनमेंट" आउट-ऑफ-द-बॉक्स का समर्थन करते हुए जारी किया गया था।
यूजीन कुलबुहोव

1
यह स्वीकृत उत्तर होना चाहिए - नया विनाश ऐसा करने का एक शानदार तरीका है।
Jez

68

बस एक वस्तु शाब्दिक वापसी

function newCodes(){
    var dCodes = fg.codecsCodes.rs; // Linked ICDs  
    var dCodes2 = fg.codecsCodes2.rs; //Linked CPTs       
    return {
        dCodes: dCodes, 
        dCodes2: dCodes2
    };  
}


var result = newCodes();
alert(result.dCodes);
alert(result.dCodes2);

@SeanKinsey मुझे यह समाधान पसंद है। यह मेरे लिए उपयोगी हो सकता है। एक प्रश्न, क्या रिटर्न में किसी फ़ंक्शन की आवश्यकता होनी चाहिए परिणाम का हर उदाहरण ( result1 .. resultN ) फ़ंक्शन की अपनी प्रति प्राप्त करेगा या फ़ंक्शन कोड का पुन: उपयोग होगा? (मुझे नहीं पता कि मैं इसके लिए कैसे परीक्षण कर सकता हूं।) टीआईए।
कार्ल

43

ES6 के बाद से आप ऐसा कर सकते हैं

let newCodes = function() {  
    const dCodes = fg.codecsCodes.rs
    const dCodes2 = fg.codecsCodes2.rs
    return {dCodes, dCodes2}
};

let {dCodes, dCodes2} = newCodes()

वापसी अभिव्यक्ति {dCodes, dCodes2}है संपत्ति के मूल्य आशुलिपि और इस के बराबर है {dCodes: dCodes, dCodes2: dCodes2}

अंतिम पंक्ति पर इस असाइनमेंट को कहा जाता है ऑब्जेक्ट डिस्ट्रक्टिंग असाइनमेंट । यह किसी वस्तु का गुण मान निकालता है और उसे उसी नाम के चर में नियत करता है। यदि आप अलग-अलग नाम के चर मान लौटना चाहते हैं तो आप इसे इस तरह से कर सकते हैंlet {dCodes: x, dCodes2: y} = newCodes()


27

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

//so to capture from this function
function myfunction()
{
 var n=0;var s=1;var w=2;var e=3;
 return [n,s,w,e];
}

//instead of having to make a named array or object like this
var IexistJusttoCapture = new Array();
IexistJusttoCapture = myfunction();
north=IexistJusttoCapture[0];
south=IexistJusttoCapture[1];
west=IexistJusttoCapture[2];
east=IexistJusttoCapture[3];

//you'll be able to just do this
[north, south, west, east] = myfunction(); 

आप इसे फ़ायरफ़ॉक्स में पहले ही आज़मा सकते हैं!


24

नए पेश किए गए (ईएस 6) सिंटैक्स का उल्लेख करने के लिए एक और मूल्य विनाशकारी असाइनमेंट के अलावा ऑब्जेक्ट निर्माण शॉर्टहैंड का उपयोग है।

function fun1() {
  var x = 'a';
  var y = 'b';
  return { x, y, z: 'c' };
  // literally means { x: x, y: y, z: 'c' };
}

var { z, x, y } = fun1(); // order or full presence is not really important
// literally means var r = fun1(), x = r.x, y = r.y, z = r.z;
console.log(x, y, z);

इस सिंटैक्स को पुराने ब्राउज़रों के लिए बेबल या अन्य जेएस पॉलीफिलर के साथ पॉलीफ़िल किया जा सकता है लेकिन सौभाग्य से अब क्रोम और फ़ायरफ़ॉक्स के हाल के संस्करणों के साथ मूल रूप से काम करता है।

लेकिन एक नई वस्तु बनाते समय, मेमोरी एलोकेशन (और अंतिम gc लोड) यहाँ शामिल है, इससे बहुत प्रदर्शन की उम्मीद न करें। वैसे भी अत्यधिक इष्टतम चीजों को विकसित करने के लिए जावास्क्रिप्ट सबसे अच्छी भाषा नहीं है, लेकिन अगर जरूरत है, तो आप अपने परिणाम को आसपास की वस्तु या ऐसी तकनीकों पर विचार कर सकते हैं जो आमतौर पर जावास्क्रिप्ट, जावा और अन्य भाषाओं के बीच सामान्य प्रदर्शन के गुर हैं।


यह अभी IE या एज पर काम नहीं कर रहा है, बस ध्यान देना चाहता था।
user1133275

यह काफी थोड़ा सा उपयोग कर रहा है ... यह तेज / चिकनी है एक सरणी का उपयोग करें और यदि संभव हो तो किसी ऑब्जेक्ट का निर्माण करने से बचें जैसा कि @ user3015682 द्वारा दिखाया गया है।
dkloke

18

इसके लिए सबसे अच्छा तरीका है

function a(){
     var d=2;
     var c=3;
     var f=4;
     return {d:d,c:c,f:f}
}

फिर उपयोग करें

a().f

वापसी ४

ES6 में आप इस कोड का उपयोग कर सकते हैं

function a(){
      var d=2;
      var c=3;
      var f=4;
      return {d,c,f}
}

फिर प्रत्येक चर के लिए फिर से फ़ंक्शन चलाएं? यह सबसे अच्छा तरीका नहीं है।
एलिया इलियाशेंको

यह फ़ंक्शन बहु मान लौटाता है, शायद सबसे अच्छा तरीका नहीं है।
बेहनाम मोहम्मदी

हर बार जब दुभाषिया एक () से मिलता है तो वह फिर से फंक्शन चलाता है। तो, var f = (a) f; var c = (a) c; var d = (a) d; तीन बार लॉन्च करेगा (), जो प्रदर्शन के नुकसान का खतरा है। बेहतर तरीका var परिणाम = (a) होगा; var f = result.f; आदि
एलिया इलियाशेंको

1
बेहतर प्रदर्शन के लिए ठीक है, आप एक चर के लिए मूल्य रख सकते हैं और इसका उपयोग कर सकते हैं, उदाहरण के लिए var result = a (); और value result.d या result.c और result.f का उपयोग करें, इसलिए केवल एक समय पर () फ़ंक्शन चलाएं।
बेहनाम मोहम्मदी

9

किसी सरणी या ऑब्जेक्ट को वापस करने के अलावा, जैसा कि दूसरों ने सुझाया है, आप एक कलेक्टर फ़ंक्शन ( द लिटिल स्कैमर में पाए जाने वाले के समान) का भी उपयोग कर सकते हैं :

function a(collector){
  collector(12,13);
}

var x,y;
a(function(a,b){
  x=a;
  y=b;
});

मैंने यह देखने के लिए jsperf परीक्षण किया कि तीन में से कौन सी विधि अधिक तेज़ है। ऐरे सबसे तेज़ है और कलेक्टर सबसे धीमा है।

http://jsperf.com/returning-multiple-values-2


आमतौर collectorपर कहा जाता है continuationऔर तकनीक को सीपीएस
19

7

जेएस में, हम आसानी से एक सरणी या ऑब्जेक्ट के साथ एक टपल लौटा सकते हैं, लेकिन मत भूलना! => जेएस एक callbackउन्मुख भाषा है, और "कई मूल्यों को लौटाने" के लिए यहां थोड़ा रहस्य है जिसे किसी ने अभी तक उल्लेख नहीं किया है, यह प्रयास करें:

var newCodes = function() {  
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return dCodes, dCodes2;
};

हो जाता है

var newCodes = function(fg, cb) {  
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    cb(null, dCodes, dCodes2);
};

:)

bam! यह आपकी समस्या को हल करने का एक और तरीका है।


6

इस प्रश्न को पूर्ण संसाधन बनाने के लिए लापता महत्वपूर्ण भागों को जोड़ना, क्योंकि यह खोज परिणामों में आता है।

वस्तु विनाशकारी

ऑब्जेक्ट डिस्ट्रक्ट्यूरिंग में, आपको अपने वैरिएबल नाम के समान महत्वपूर्ण मान का उपयोग करने की आवश्यकता नहीं है, आप इसे नीचे परिभाषित करके एक अलग वेरिएबल नाम असाइन कर सकते हैं:

const newCodes = () => {  
    let dCodes = fg.codecsCodes.rs;
    let dCodes2 = fg.codecsCodes2.rs;
    return { dCodes, dCodes2 };
};

//destructuring
let { dCodes: code1, dCodes2: code2 } = newCodes();

//now it can be accessed by code1 & code2
console.log(code1, code2);

एरेक्ट डिस्ट्रक्टिंग

सरणी विनाशकारी में, आप उन मूल्यों को छोड़ सकते हैं जिनकी आपको आवश्यकता नहीं है।

const newCodes = () => {  
    //...
    return [ dCodes, dCodes2, dCodes3 ];
};

let [ code1, code2 ] = newCodes(); //first two items
let [ code1, ,code3 ] = newCodes(); //skip middle item, get first & last
let [ ,, code3 ] = newCodes(); //skip first two items, get last
let [ code1, ...rest ] = newCodes(); //first item, and others as an array

यह ध्यान देने योग्य है कि ...restहमेशा अंत में होना चाहिए क्योंकि यह सब कुछ एकत्र होने के बाद कुछ भी नष्ट करने का कोई मतलब नहीं हैrest

मुझे उम्मीद है कि यह इस सवाल का कुछ मूल्य जोड़ देगा :)



5

जावास्क्रिप्ट में कई मूल्यों को वापस करने का एक बहुत ही सामान्य तरीका एक वस्तु शाब्दिक का उपयोग कर रहा है , इसलिए कुछ इस तरह है:

const myFunction = () => {
  const firstName = "Alireza", 
        familyName = "Dezfoolian",
        age = 35;
  return { firstName, familyName, age};
}

और इस तरह से मान प्राप्त करें:

myFunction().firstName; //Alireza
myFunction().familyName; //Dezfoolian
myFunction().age; //age

या इससे भी छोटा तरीका:

const {firstName, familyName, age} = myFunction();

और उन्हें व्यक्तिगत रूप से प्राप्त करें:

firstName; //Alireza
familyName; //Dezfoolian
age; //35

4

आप "ऑब्जेक्ट" का उपयोग कर सकते हैं

function newCodes(){
    var obj= new Object();
    obj.dCodes = fg.codecsCodes.rs;
    obj.dCodes2 = fg.codecsCodes2.rs;

    return obj;
}

1
यह IE के लिए जाने का रास्ता है। बाद में उपयोग करें: obj = newCodes (); चेतावनी (obj.dCodes);
असिन कासिमोव

3

सब सही है। returnतार्किक रूप से बाएं से दाएं प्रक्रियाएं करता है और अंतिम मूल्य देता है।

function foo(){
    return 1,2,3;
}

>> foo()
>> 3

1
,संचालक हो और किसी भी अभिव्यक्ति में इस्तेमाल किया जा सकता है। यहां कुछ खास नहीं returnहै।
gman

3

मैं नवीनतम विनाशकारी असाइनमेंट का उपयोग करने का सुझाव दूंगा (लेकिन सुनिश्चित करें कि यह आपके वातावरण में समर्थित है )

var newCodes = function () {
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return {firstCodes: dCodes, secondCodes: dCodes2};
};
var {firstCodes, secondCodes} = newCodes()

2

मुझे ऐसा करने के दो तरीके पता हैं: 1. Array के रूप में लौटें 2. ऑब्जेक्ट के रूप में लौटें

यहाँ एक उदाहरण मैंने पाया है:

<script>
// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var arr = [dividend, divisor, quotient];
    return arr;
}

// Store returned value in a variable
var all = divideNumbers(10, 2);

// Displaying individual values
alert(all[0]); // 0utputs: 10
alert(all[1]); // 0utputs: 2
alert(all[2]); // 0utputs: 5
</script>



<script>
// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var obj = {
        dividend: dividend,
        divisor: divisor,
        quotient: quotient
    };
    return obj;
}

// Store returned value in a variable
var all = divideNumbers(10, 2);

// Displaying individual values
alert(all.dividend); // 0utputs: 10
alert(all.divisor); // 0utputs: 2
alert(all.quotient); // 0utputs: 5
</script>

1

कुछ दिन पहले मुझे एक फ़ंक्शन से एकाधिक रिटर्न मान प्राप्त करने की समान आवश्यकता थी जो मैंने बनाई थी।

कई रिटर्न मानों से, मुझे किसी दिए गए शर्त के लिए केवल विशिष्ट मूल्य और फिर अन्य शर्त के अनुरूप अन्य वापसी मूल्य की आवश्यकता होती है।


यहाँ उदाहरण है कि मैंने ऐसा कैसे किया:

समारोह:

function myTodayDate(){
    var today = new Date();
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    var month = ["January","February","March","April","May","June","July","August","September","October","November","December"];
    var myTodayObj = 
    {
        myDate : today.getDate(),
        myDay : day[today.getDay()],
        myMonth : month[today.getMonth()],
        year : today.getFullYear()
    }
    return myTodayObj;
}

फ़ंक्शन द्वारा लौटाए गए ऑब्जेक्ट से आवश्यक वापसी मूल्य प्राप्त करना:

var todayDate = myTodayDate().myDate;
var todayDay = myTodayDate().myDay;
var todayMonth = myTodayDate().myMonth;
var todayYear = myTodayDate().year;

इस प्रश्न का उत्तर देने का पूरा बिंदु तारीख को अच्छे प्रारूप में प्राप्त करने के इस दृष्टिकोण को साझा करना है। आशा है कि यह आपकी मदद करेगा :)


1

मैं यहां कुछ नया नहीं जोड़ रहा हूं लेकिन एक और वैकल्पिक तरीका है।

 var newCodes = function() {
     var dCodes = fg.codecsCodes.rs;
     var dCodes2 = fg.codecsCodes2.rs;
     let [...val] = [dCodes,dCodes2];
     return [...val];
 };

0

वैसे हम आपकी कोशिश को ठीक नहीं कर सकते। लेकिन नीचे कुछ होने की संभावना हो सकती है।

function multiReturnValues(){
    return {x:10,y:20};
}

फिर जब विधि को बुलाते हैं

const {x,y} = multiReturnValues();

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