¿Devolver múltiples valores en JavaScript?

CorePress2024-01-16  10

Estoy intentando devolver dos valores en JavaScript. es posible?

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

1

Puedes resolver esto usando devoluciones de llamada. Si estás dispuesto a hacerlo, consulta mi respuesta. La gente olvida que se pueden "devolver múltiples valores" antes de tiempo. fácilmente con JS, usando tuplas o incluso: ¡devoluciones de llamada!

- Alexander Mills

27/01/2017 a las 5:10

31

Las respuestas están desactualizadas. Ahora es posible. 2ality.com/2014/06/es6-multiple-return-values.html

- Erel Segal-Halevi

27 de abril de 2017 a las 5:54

13

Técnicamente, todavía estás devolviendo un solo objeto/matriz, es solo la deconstrucción que es más simple en ES6.

-Andrea Bergonzo

15/04/2019 a las 0:36

3

Creo que Andrea se refiere a "desestructurar". Pero sí, todavía no devuelves más de un elemento de una función: ese elemento puede ser un objeto que contenga cualquier cantidad de claves o una matriz con n elementos.

- Cajas

22/06/2021 a las 14:10

Puedes considerar esta página de tutorial

-Cadoiz

24 de octubre de 2022 a las 14:27



------------------------------------

No, pero podrías devolver una matriz que contenga tus valores:

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

Entonces podrás acceder a ellos así:

const [first, second] = getValues()

Esto se llama asignación de desestructuración y es compatible con todos los principales entornos JS. Es equivalente a lo siguiente:

const values = getValues()
const first = values[0]
const second = values[1]

También puedes devolver un objeto si quieres asignar un nombre a cada valor:

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

Y para acceder a ellos:

const {first, second} = getValues()

Que es lo mismo que:

const values = getValues()
const first = values.first
const second = values.second

Se recomienda encarecidamente devolver un objeto en lugar de una matriz a menos que los valores tengan sentido como una tupla simple, p. un par de coordenadas [x, y]. Con una matriz, es fácil olvidar cuálvalor es cuál, es más difícil agregar más valores más adelante y es marginalmente más difícil escribir correctamente con TypeScript o JSDoc.

6

2

@alexela Seguro que puedes simplemente usar var dCodes = newCodes().dCodes; var dCodes2 = newCodes().dCodes2 Sin embargo, llamará a la función dos veces, lo que puede ser un desperdicio de recursos si es compleja.

- Vadim Kirilchuk

25/02/2016 a las 21:39

15

@VadimKirilchuk No es necesario llamarlo dos veces con la tarea de desestructuración, ej. const { dCodes, dCodes2 } = nuevosCodes();

-Taylor D. Edmiston

30 de enero de 2017 a las 6:31

7

como dijeron otras respuestas (y los comentarios implicaron), ES6 trae algunas opciones aquí. 3 para ser exactos: (1) la propiedad del objeto devuelve brevemente {dCodes, dCodes2} funciona soloigual que @Intelekshual mencionó y (2) usando la misma función, simplemente podría acceder a ellos con matrices desestructurantes [dCodes, dCodes2] = newCodes() o (3) objetos ({dCodes, dCodes2} = newCodes()) (no es necesario use una declaración allí @Taylor, aunque una var sería más adecuada para el ejemplo actual de Sasha).

- cregox

18/03/2017 a las 9:09

1

¿Cómo debo escribir descripciones jsDoc para funciones que devuelven múltiples valores en una matriz [valor1, valor2] o en un objeto {a: valor1, b: valor2}?

& ndash;Julio

13 de agosto de 2021 a las 21:26

1

Además, si necesita especificar este tipo de tipo en Typecript, puede simplemente reemplazar los valores con sus tipos, p. función foo(): [cadena, cadena] { /* ... */ }

Zenul_Abidin

6 de noviembre de 2023 a las 14:34



------------------------------------

Puedes hacer esto desde ECMAScript 6 en adelante usando matrices y "asignaciones de desestructuración". Tenga en cuenta que estos no están disponibles en Javasc anteriores.versiones ript (es decir, ni con ECMAScript tercera ni quinta edición).

Te permite asignar a 1+ variables simultáneamente:

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

// or

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

También puedes usar la desestructuración de objetos combinada con la taquigrafía del valor de propiedad para nombrar los valores de retorno en un objeto y seleccionar los que quieras:

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

Y por cierto, no te dejes engañar por el hecho de que ECMAScript te permite devolver 1, 2,.... Lo que realmente sucede allí no es lo que podría parecer. Una expresión en la declaración de retorno (1, 2, 3) no es más que un operador de coma aplicado a literales numéricos (1, 2 y 3) secuencialmente, que eventualmente se evalúa como el valor de su última expresión: 3. Es por eso que devuelve 1, 2, 3 es funcionalmente idéntico a nada más que devolver 3.

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

26 de mayo de 2010 a las 23:09

kangax

kangax

39k

13

13 insignias de oro

99

99 insignias de plata

135

135 insignias de bronce

5

2

Cosa extraña e interesante del último ejemplo: para una función foo(){return 1,2,3;} al ejecutar console.log([].push(foo())) se imprime 1.

-Meredith

25/10/2013 a las 20:45

1

por qué var [x, y] = [1, 2]; X; // 1 año; // 2 ¿Esto no funciona en Chrome? generar un error; ReferenceError: lado izquierdo no válido en la tarea

- Naveen Agarwal

8 de junio de 2014 a las 5:25

@NaveenAgarwal Chrome aún no es totalmente compatible con ECMAScript 6, por lo que la destrucciónse especifica la asignación

- gilbertbw

15/07/2014 a las 10:50

1

Chrome v49 se lanzó hace una semana y admite "tareas de desestructuración" listo para usar.

- Eugene Kulabuhov

10/03/2016 a las 14:29

Qué devolvería (1, 2, 3); ¿hacer? Esto podría agregarse a la respuesta.

& ndash; Cadoiz

24/10/2022 a las 14:00



------------------------------------

Simplemente devuelve un objeto literal

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

2

@SeanKinsey Me gusta esta solución. Puede que me sea útil. Una pregunta: ¿en caso de que fuera necesaria una función en la devolución, cada instancia del resultado (resultado1... resultadoN) obtendría su propia copia de la función o se reutilizaría el código de la función? (No sé cómo podría hacer la prueba para estos.) TIA.

- Karl

29/10/2012 a las 16:28

Respuesta fácil y comprensible. Lo entendí con sólo una mirada. Gracias

- Lakshay Rohilla

12 de octubre de 2022 a las 7:10



------------------------------------

Desde ES6 puedes hacer esto

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

let {dCodes, dCodes2} = newCodes()

La expresión de retorno {dCodes, dCodes2} es una abreviatura del valor de propiedad y es equivalente a esto {dCodes: dCódigos, dCodes2: dCodes2}.

Esta asignación en la última línea se llama asignación de destrucción de objetos. Extrae el valor de propiedad de un objeto y lo asigna a una variable del mismo nombre. Si desea asignar valores de retorno a variables de diferentes nombres, puede hacerlo así: {dCodes: x, dCodes2: y} = newCodes()

2

developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

-djvg

4 de julio de 2023 a las 10:16

He estado buscando durante mucho tiempo para saber qué es esto, gracias

- golpeador

31 de diciembre de 2023 a las 9:06



------------------------------------

Ecmascript 6 incluye "asignaciones de desestructuración" (como mencionó kangax), por lo que en todos los navegadores (no solo Firefox) podrá capturar una matriz de valores sin tener que crear una matriz u objeto con nombre con el único propósito de capturar ellos.

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

¡Ya puedes probarlo en Firefox!

0



------------------------------------

Otra sintaxis recientemente introducida (ES6) que vale la pena mencionar es el uso de taquigrafía para la creación de objetos además de la destrucción de asignaciones.

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

Esta sintaxis se puede rellenar con babel u otro polyfiller js para navegadores más antiguos, pero afortunadamente ahora funciona de forma nativa con las versiones recientes de Chrome y Firefox.

Pero al crear un nuevo objeto, la asignación de memoria (y la eventual carga de gc) están involucradas aquí, no espere mucho rendimiento de ello. De todos modos, JavaScript no es el mejor lenguaje para desarrollar cosas altamente óptimas, pero si es necesario, puede considerar poner el resultado en el objeto circundante o en técnicas similares que generalmente son trucos de rendimiento comunes entre JavaSc.ript, Java y otros lenguajes.

2

Eso aún no funciona en IE o Edge, solo quería señalarlo.

Usuario1133275

11/01/2017 a las 17:58

He estado usando esto bastante... es más rápido y fluido usar una matriz y evitar construir un objeto si es posible, como lo muestra @user3015682.

- dkloke

9 agosto 2017 a las 15:26



------------------------------------

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

Entonces usa

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

En nueva versión:

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

3

2

¿Entonces ejecutar la función nuevamente para cada variable? Ese no es el mejor enfoque.

-Megan Caithlyn

22/10/2015 a las 20:18

Cada vez que el intérprete se encuentra con a(), ejecuta la función nuevamente. Entonces, var f = a().f; var c = a().c; var d = a().d; lanzará a() tres veces, lo que es propenso a perder rendimiento. El mejor enfoque sería var result = a(); var f = resultado.f; etc.

-Megan Caithlyn

15/11/2015 a las 13:06

1

ok, para un mejor rendimiento, puedes mantener el valor de una variable y usarlo, por ejemplo var result=a(); y use el valor result.d o result.c y result.f, así que ejecute una función () al mismo tiempo.

- Behnam

16 de noviembre de 2015 a las 6:25



------------------------------------

Una forma muy común de devolver múltiples valores en javascript es usar objetos literales, por ejemplo:

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

y obtener los valores como este:

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

o incluso una forma más corta:

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

y obtenerlos individualmente como:

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



------------------------------------

Aparte de devolver una matriz o un objeto como otella lo ha recomendado, también puedes usar una función de recopilación (similar a la que se encuentra en The Little Schemer):

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

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

Hice una prueba jsperf para ver cuál de los tres métodos es más rápido. La matriz es la más rápida y el recopilador es el más lento.

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

1

Normalmente el recopilador se llama continuación y la técnica se llama CPS

- Ceving

31 de mayo de 2019 a las 14:03



------------------------------------

En JS, podemos devolver fácilmente una tupla con una matriz u objeto, ¡pero no lo olvides! => JS es un lenguaje orientado a la devolución de llamadas, y aquí hay un pequeño secreto para "devolver múltiples valores" que nadie ha mencionado todavía, prueba esto:

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

se convierte

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

:)

¡bam! Esta es simplemente otra forma de resolver tu problema.



------------------------------------

También puedes hacer:

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

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

0



------------------------------------

Agregar las partes importantes que faltan para hacer de esta pregunta un recurso completo, a medida que aparece en los resultados de búsqueda.

Desestructuración de objetos

En la desestructuración de objetos, no necesariamente necesita usar el mismo valor clave que el nombre de su variable; puede asignar un nombre de variable diferente definiéndolo de la siguiente manera:

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

Desestructuración de matrices

En la desestructuración de matrices, puedes omitir los valores que no necesitas.

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

Vale la pena señalar que... el descanso siempre debe estar al final, ya que no tiene ningún sentido destruir nada después de que todo lo demás se haya agregado al descanso.

Espero que esto agregue algún valor a esta pregunta :)



------------------------------------

Puedes utilizar "Objeto"

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

    return obj;
}

1

1

Este es el camino a seguir para IE. Uso posterior como: let obj = newCodes(); alerta(obj.dCodes);

- Ahmed Ahmedov

23 dic 2019 a las 13:16



------------------------------------

Sugeriría utilizar la última tarea de desestructuración (pero asegúrese de que sea compatible con su entorno)

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



------------------------------------

Todo está correcto. return procesa lógicamente de izquierda a derecha y devuelve el último valor.

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

>> foo()
>> 3

1

1

el , es un operador y puede serutilizado en cualquier expresión. No hay nada especial en regresar aquí.

-gman

27 dic 2017 a las 6:53



------------------------------------

Conozco dos formas de hacer esto: 1. Regresar como matriz 2. Devolver como objeto

Aquí hay un ejemplo que encontré:

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



------------------------------------

Hace unos días tuve el requisito similar de obtener múltiples valores de retorno de una función que creé.

De muchos valores de retorno, necesitaba que devolviera solo spvalor específico para una condición dada y luego otro valor de retorno correspondiente a otra condición.

Aquí está el ejemplo de cómo lo hice:

Función:

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

Obtener el valor de retorno requerido del objeto devuelto por la función:

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

El objetivo de responder esta pregunta es compartir este enfoque para obtener la fecha en un buen formato. Espero que te haya ayudado :)



------------------------------------

No estoy agregando nada nuevo aquí sino otra forma alternativa.

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

20 de diciembre, 2018 a las 5:25

kumar

kumar

11

4

4 insignias de bronce



------------------------------------

Bueno, no podemos hacer exactamente lo que intentas. Pero es probable que se pueda hacer algo que se detalla a continuación.

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

Luego al llamar al método

const {x,y} = multiReturnValues();

console.log(x) ---> 10
console.log(y) ---> 20



------------------------------------

Es posible devolver una cadena con muchos valores y variables usando los literales de plantilla `${}`

me gusta:

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

Es breve y sencillo.

Respondido al

19 de agosto de 2020 a las 9:15

Juan Luces

Juan Luces

29

7

7 insignias de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare