Question Renvoyer plusieurs valeurs en JavaScript?


J'essaie de retourner deux valeurs en JavaScript. Est-ce possible?

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

561
2018-05-26 22:06


origine


Réponses:


Non, mais vous pouvez retourner un tableau contenant vos valeurs:

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

Ensuite, vous pouvez y accéder comme ceci:

var codes = newCodes();
var dCodes = codes[0];
var dCodes2 = codes[1];

Si vous voulez mettre des "labels" sur chacune des valeurs retournées (plus facile à maintenir), vous pouvez retourner un objet:

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

Et pour y accéder:

var codes = newCodes();
var dCodes = codes.dCodes;
var dCodes2 = codes.dCodes2;

905
2018-05-26 22:09



Vous pouvez le faire à partir de Javascript 1.7 en utilisant "missions destructurantes". Notez que ceux-ci ne sont pas disponibles dans les anciennes versions Javascript (ce qui signifie - ni avec ECMAScript 3ème ni 5ème éditions).

Il vous permet d'attribuer simultanément 1+ variables:

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

// or

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

Vous pouvez aussi utiliser déstructuration d'objet combinée avec la valeur de la propriété raccourcie nommer les valeurs de retour dans un objet et choisir celles que vous voulez:

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

Et en passant, ne vous laissez pas berner par le fait qu'ECMAScript vous permet de return 1, 2, .... Ce qui se passe vraiment là n'est pas ce qui peut sembler. Une expression dans la déclaration de retour - 1, 2, 3 - n'est rien d'autre qu'un opérateur virgule appliqué aux littéraux numériques (1 , 2, et 3) séquentiellement, qui évalue finalement à la valeur de sa dernière expression - 3. C'est pourquoi return 1, 2, 3 est fonctionnellement identique à rien de plus, mais return 3.

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

146
2018-05-26 23:09



Renvoie juste un objet littéral

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);

52
2018-05-26 22:11



Ecmascript 6 inclut des "affectations destructurantes" (comme kangax mentionné) donc dans tous les navigateurs (pas seulement Firefox) vous serez capable de capturer un tableau de valeurs sans avoir à créer un tableau ou un objet nommé dans le seul but de les capturer.

//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(); 

Vous pouvez déjà l'essayer dans Firefox!


23
2017-12-10 06:51



Un autre mérite de mentionner la syntaxe nouvellement introduite (ES6) est l'utilisation de raccourcis de création d'objets en plus de l'affectation destructive.

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);

Cette syntaxe peut être polyfilled avec babel ou autre polyfiller de js pour les navigateurs plus anciens mais heureusement fonctionne maintenant nativement avec les versions récentes de Chrome et de Firefox.

Mais en ce qui concerne la création d'un nouvel objet, l'allocation de mémoire (et la charge gc éventuelle) sont impliquées ici, n'attendez pas beaucoup de performance de celle-ci. JavaScript n'est pas le meilleur langage pour développer des choses optimales de toute façon, mais si cela est nécessaire, vous pouvez envisager de placer votre résultat sur des objets environnants ou des techniques qui sont généralement des astuces de performance courantes entre JavaScript, Java et d'autres langages.


19
2017-10-01 07:12



Le meilleur moyen pour cela est

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

Ensuite, utilisez

a().f

retour 4

dans ES6, vous pouvez utiliser ce code

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

15
2017-09-08 08:38



Depuis ES6, vous pouvez le faire

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

let {dCodes, dCodes2} = newCodes()

Retour expression {dCodes, dCodes2} est sténographie valeur de la propriété et est équivalent à cela {dCodes: dCodes, dCodes2: dCodes2}.

Cette affectation en dernière ligne est appelée affectation destructive d'objet. Il extrait la valeur de propriété d'un objet et l'affecte à une variable de même nom. Si vous souhaitez attribuer des valeurs de retour à des variables de noms différents, vous pouvez le faire comme ceci let {dCodes: x, dCodes2: y} = newCodes()


12
2018-03-01 13:59



En plus de renvoyer un tableau ou un objet comme d'autres l'ont recommandé, vous pouvez également utiliser une fonction de collecteur (similaire à celle trouvée dans Le petit Schemer):

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

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

J'ai fait un test jsperf pour voir laquelle des trois méthodes est la plus rapide. Le tableau est le plus rapide et le collecteur est le plus lent.

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


6
2017-08-24 17:15



Vous pouvez aussi faire:

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

const {d,c,f} = a()

4
2018-06-05 17:37



Dans JS, nous pouvons facilement retourner un tuple avec un tableau ou un objet, mais n'oubliez pas! => JS est un callback langage orienté, et il y a un petit secret ici pour "renvoyer plusieurs valeurs" que personne n'a encore mentionné, essayez ceci:

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

devient

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

:)

bam! C'est simplement une autre façon de résoudre votre problème.


4
2018-01-27 05:08