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?

Carson Myers
fuente

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'
Mathias Bynens
fuente
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.

Andy E
fuente
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.

grave
fuente
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
5

Implementación de la idea seria.

http://jsfiddle.net/RichAyotte/6D2wP/

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Richard Ayotte
fuente
Este me alegró el día. Desempacando listas a través de Apply, ¡bien hecho señor!
mike239x
2
var one = arr[0];
var two = arr[1];
robar waminal
fuente
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 ".

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