Распаковка массива в отдельные переменные в JavaScript

144

Это простая проблема, и я уже делал это раньше. Я просто не могу вспомнить, как и как именно это называлось.

В python я могу сделать это:

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

как мне это сделать в JavaScript?

Карсон Майерс
источник

Ответы:

178

В настоящее время это единственное кросс-браузерное решение AFAIK:

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

ES6 позволит назначать деструктуризацию:

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

Или, если придерживаться исходного примера:

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

Вы также можете создать значение по умолчанию:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'
Матиас Байненс
источник
5
Назначение деструктуризации на сегодняшний день полностью поддерживается kangax.github.io/compat-table/es6/#test-destructuring
grandrew
21

Это деструктурирующее задание . Вы можете сделать это в некоторых браузерах со следующим синтаксисом:

[one, two] = arr;

Он поддерживается некоторыми последними браузерами и транспиляторами, такими как Babel и Traceur . Это была функция, представленная в ECMAScript 4, который позже стал ECMAScript Harmony, который в конечном итоге стал ES 2015.

Энди Э
источник
Похоже, это часть ES6 (2015), а не ES4? ecma-international.org/ecma-262/6.0/...
джеб
@jab: спасибо! иногда эти старые ответы забываются и становятся устаревшими, хотя похоже, что Матиас уже добавил эту информацию в свой ответ :)
Энди Э
6

Вы можете использовать функцию применения массива, если хотите, чтобы элементы массива передавались в качестве аргументов функции.

серьезный
источник
4
Я не уверен, что у JavaScript Arrayесть .apply()функция. Я думаю, вы имели в виду some_function.apply(this, my_array). Смотрите этот ответ
Kit
5

Реализация серьезной задумки.

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

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Ричард Айотт
источник
Этот сделал мой день. Распаковка списков через apply, молодец, сэр!
mike239x
2
var one = arr[0];
var two = arr[1];
ограбить васинал
источник
1
Вы действительно должны использовать, varчтобы переменные не загрязняли глобальную область видимости.
Матиас Байненс,
Я просто предполагаю, что это все объявленные переменные :)
rob waminal
Вероятно, лучше объявить все vars для каждой области за один раз, чем иметь два отдельных varобъявления.
Матиас Байненс,
2

В CoffeeScript он есть: http://jashkenas.github.com/coffee-script/#pattern_matching

И, цитируется вверху страницы:

«CoffeeScript - это небольшой язык, который компилируется в JavaScript. Думайте о нем как о менее показном младшем брате JavaScript - те же гены, примерно такой же рост, но другое чувство стиля. Помимо нескольких бонусных вкусностей, утверждения в CoffeeScript соответствуют одному -to-one с их эквивалентом в JavaScript, это просто другой способ сказать это ".

Якоб
источник
1
Это не отвечает на вопрос. Я понимаю, что в CoffeeScript есть кое-что интересное, но вопрос касается Javascript.
Ховис Биддл,
Мертвая ссылка: ((((
Пол Дрейпер,