Desempacando la matriz en variables separadas en JavaScript


141

Este es un problema simple, y lo he hecho antes. Simplemente no puedo recordar cómo o cómo se llamaba exactamente.

En python puedo hacer esto:

arr = ['one', 'two']
one, two = arr

¿Cómo hago eso en JavaScript?

Respuestas:


173

Esta es actualmente la única solución compatible con varios navegadores AFAIK:

var one = arr[0],
    two = arr[1];

ES6 permitirá la asignación de desestructuración:

let [x, y] = ['foo', 'bar'];
console.log(x); // 'foo'
console.log(y); // 'bar'

O, para apegarse a su ejemplo inicial:

var arr = ['one', 'two'];
var [one, two] = arr;

También puede crear un valor predeterminado:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'

55
asignación de desestructuración tiene soporte completo a partir de hoy kangax.github.io/compat-table/es6/#test-destructuring
grandrew

20

Esa es una tarea desestructuradora . Puede hacerlo en algunos navegadores con la siguiente sintaxis:

[one, two] = arr;

Es compatible con algunos de los últimos navegadores y transpiladores como Babel y Traceur . Esta fue una característica introducida con ECMAScript 4 que más tarde se convirtió en ECMAScript Harmony, que finalmente se convirtió en ES 2015.


Parece que es parte de ES6 (2015), no ES4? ecma-international.org/ecma-262/6.0/…
jab

@jab: gracias! a veces estas viejas respuestas se olvidan y quedan obsoletas, aunque parece que Mathias ya agregó esa información a su respuesta :)
Andy E


6

Puede usar la función de aplicación de matriz si desea que se pasen elementos de una matriz como argumentos de función.


44
No estoy seguro de que un JavaScript Arraytenga una .apply()función. Creo que quisiste decir some_function.apply(this, my_array). Ver esta respuesta
Kit


2
var one = arr[0];
var two = arr[1];

1
Realmente debería usar varpara evitar que las variables contaminen el alcance global.
Mathias Bynens

Solo estoy asumiendo que todas sus variables declaradas :)
rob waminal

Probablemente sea una mejor idea declarar todos los vars para cada alcance de una vez en lugar de tener dos vardeclaraciones separadas .
Mathias Bynens

2

CoffeeScript lo tiene: http://jashkenas.github.com/coffee-script/#pattern_matching

Y, citado desde la parte superior de la página:

"CoffeeScript es un pequeño lenguaje que se compila en JavaScript. Piense en él como el hermano menor menos ostentoso de JavaScript: los mismos genes, aproximadamente la misma altura, pero un sentido de estilo diferente. Además de un puñado de extras, las declaraciones en CoffeeScript corresponden a uno -to-uno con su equivalente en JavaScript, es solo otra forma de decirlo ".


1
Esto no responde la pregunta. Aprecio que CoffeeScript tenga algunas cosas buenas, pero la pregunta es sobre Javascript.
Hovis Biddle

Enlace muerto: ((((
Paul Draper
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.