Python tiene una forma sucinta de asignar una función con un parámetro a múltiples variables, hecho como una sola línea. Me gustaría saber si JavaScript tiene la misma forma o una forma similar de hacerlo.
He encontrado varios ejemplos que describen múltiples asignaciones de variables para JavaScript, usando múltiples asignaciones y Destructuring. El problema con estos métodos es que pueden, o requieren, la igualdad de variable a valor: let a = b = c = some_value
, o let [a, b] = [x, y]
. Aquí es donde tengo un problema con una parte particular del código.
Pitón
#!/usr/bin/env python3 def numbers(arr): if len(arr) <= 1: return arr left_half, right_half = divide(arr) # The code in question; Multi-variable assignment return left_half, right_half def divide(arr): mid = len(arr) // 2 left = arr[:mid] right = arr[mid:] return left, right l = [12, 45, 9, 2, 5] print(numbers(l)) # ...([12, 45],[9, 2, 5])
JavaScript
function numbers(arr) { if (arr.length <= 1) { return arr; } let leftHalf, rightHalf = divide(arr); // The not-so-equivalent code return leftHalf, rightHalf; } function divide(arr) { let mid = Math.floor(arr.length / 2); let left = arr.slice(0, mid); let right = arr.slice(mid); return left, right; } const l = [12, 45, 9, 2, 5]; console.log(numbers(l)); // ...[9, 2, 5]
¿Cómo se puede lograr el mismo patrón o un patrón similar al de Python en el código JavaScript?
En la pregunta, usted afirma que no puede usar Destructuring. Sin embargo, Destructuring, más precisamente, unpatrón de enlace de desestructuración de matriz es exactamente la herramienta adecuada para usar aquí, por lo que realmente debería usarla. (Bueno, excepto por el hecho de que es redundante, pero hablaremos de eso más adelante).
Así es como haría una traducción 1: 1 del código Python (bueno, excepto por el hecho de que ECMAScript no tiene tuplas) a ECMAScript:
function numbers(arr) { if (arr.length <= 1) { return arr; } const [leftHalf, rightHalf] = divide(arr); return [leftHalf, rightHalf]; } function divide(arr) { const mid = Math.floor(arr.length / 2); const left = arr.slice(0, mid); const right = arr.slice(mid); return [left, right]; }
La única diferencia del código ECMAScript en comparación con el código Python es que en el código Python, tanto los numbers
como la divide
devuelven una tupla , mientras que ECMAScript no tiene tuplas, por lo que, en el código ECMAScript, devuelven matrices .
Sin embargo, tenga en cuenta que tanto en la versión de Python como en la de ECMAScript, los numbers
desestructuran el valor de retorno de divide
, solo para volver a colocarlo con exactamente la misma estructura de datos, por lo que puede deshacerse de la mayor parte de ese código:
function numbers(arr) { if (arr.length <= 1) { return arr; } return divide(arr); }
def numbers(arr): if len(arr) <= 1: return arr return divide(arr)
También notará que cambié todas sus variables a const
s en el código ECMAScript, ya que no está modificando sus enlaces.
Sin embargo, esta API es extraña y difícil de usar, porque la función de numbers
devuelve dos cosas completamente diferentes según la longitud de la matriz de argumentos. Devuelve una matriz de números o una matriz de matrices de números (en ECMAScript, en Python, devuelve una tupla de matrices de números). Esto hace que sea más difícil de usar para la persona que llama, ya que los diferentes tipos de devolución deben tratarse de manera diferente.