Rozpakowanie tablicy do osobnych zmiennych w JavaScript

141

To jest prosty problem i już to zrobiłem. Po prostu nie pamiętam, jak to się nazywało.

W Pythonie mogę to zrobić:

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

jak to zrobić w JavaScript?

Carson Myers
źródło

Odpowiedzi:

173

Jest to obecnie jedyne rozwiązanie AFAIK kompatybilne z różnymi przeglądarkami:

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

ES6 pozwoli na destrukcyjne przypisanie:

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

Lub, aby trzymać się swojego początkowego przykładu:

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

Możesz również utworzyć wartość domyślną:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'
Mathias Bynens
źródło
5
zadanie destrukturyzacji ma pełne wsparcie od dzisiaj kangax.github.io/compat-table/es6/#test-destrukturyzacja
grandrew
20

To destrukcyjne zadanie . Możesz to zrobić w niektórych przeglądarkach z następującą składnią:

[one, two] = arr;

Jest obsługiwany w niektórych najnowszych przeglądarkach i transpilerach, takich jak Babel i Traceur . Była to funkcja wprowadzona w ECMAScript 4, który później stał się ECMAScript Harmony, który ostatecznie stał się ES 2015.

Andy E.
źródło
Wygląda na to, że jest to część ES6 (2015), a nie ES4? ecma-international.org/ecma-262/6.0/…
jab
@jab: dzięki! czasami te stare odpowiedzi zostają zapomniane i stają się nieaktualne, chociaż wygląda na to, że Mathias już dodał te informacje do swojej odpowiedzi :)
Andy E
6

Możesz użyć funkcji zastosuj tablicę, jeśli chcesz, aby elementy tablicy były przekazywane jako argumenty funkcji.

poważny
źródło
4
Nie jestem pewien, czy JavaScript Arrayma .apply()funkcję. Myślę, że miałeś na myśli some_function.apply(this, my_array). Zobacz tę odpowiedź
Kit
5

Realizacja pomysłu poważnego.

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

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Richard Ayotte
źródło
Ten sprawił mi przyjemność. Rozpakowywanie list za pośrednictwem aplikacji Apply, dobra robota!
mike239x
2
var one = arr[0];
var two = arr[1];
rob waminal
źródło
1
Naprawdę powinieneś użyć, varaby zapobiec zanieczyszczaniu globalnego zasięgu przez zmienne.
Mathias Bynens
Zakładam tylko wszystkie zadeklarowane zmienne :)
rob waminal
Prawdopodobnie lepszym pomysłem jest zadeklarowanie wszystkich vars dla każdego zakresu za jednym zamachem, zamiast dwóch oddzielnych vardeklaracji.
Mathias Bynens
2

CoffeeScript to ma: http://jashkenas.github.com/coffee-script/#pattern_matching

I cytowany z góry strony:

„CoffeeScript to mały język, który kompiluje się do JavaScript. Pomyśl o nim jako o mniej ostentacyjnym młodszym bracie JavaScript - te same geny, mniej więcej ten sam wzrost, ale inne poczucie stylu. Oprócz kilku dodatkowych gadżetów, stwierdzenia w CoffeeScript odpowiadają jednemu -to-one z ich odpowiednikiem w JavaScript, to po prostu inny sposób wyrażenia tego. "

Jakob
źródło
1
To nie odpowiada na pytanie. Doceniam to, że CoffeeScript ma kilka fajnych rzeczy, ale pytanie dotyczy JavaScript.
Hovis Biddle,
Martwy link: ((((
Paul Draper,