Распаковка массива в отдельные переменные в 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


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.
Ховис Биддл,

Мертвая ссылка: ((((
Пол Дрейпер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.