Membongkar array menjadi variabel terpisah di JavaScript

144

Ini adalah masalah sederhana, dan saya pernah melakukannya sebelumnya. Saya hanya tidak ingat bagaimana, atau apa sebenarnya sebutan itu.

Dengan python saya bisa melakukan ini:

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

bagaimana cara melakukannya di JavaScript?

Carson Myers
sumber

Jawaban:

178

Saat ini ini adalah satu-satunya solusi AFAIK yang kompatibel lintas-browser:

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

ES6 akan memungkinkan tugas destrukturisasi:

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

Atau, untuk tetap berpegang pada contoh awal Anda:

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

Anda juga dapat membuat nilai default:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'
Mathias Bynens
sumber
5
tugas destrukturisasi memiliki dukungan penuh mulai hari ini kangax.github.io/compat-table/es6/#test-destructuring
grandrew
21

Itu tugas yang merusak . Anda dapat melakukannya di beberapa browser dengan sintaks berikut:

[one, two] = arr;

Ini didukung di beberapa browser dan transpiler terbaru seperti Babel dan Traceur . Ini adalah fitur yang diperkenalkan dengan ECMAScript 4 yang kemudian menjadi ECMAScript Harmony, yang akhirnya menjadi ES 2015.

Andy E
sumber
Sepertinya itu bagian dari ES6 (2015), bukan ES4? ecma-international.org/ecma-262/6.0/…
jab
@jab: terima kasih! terkadang jawaban lama ini dilupakan dan menjadi usang, meskipun tampaknya Mathias sudah menambahkan info itu ke jawabannya :)
Andy E
6

Anda bisa menggunakan fungsi apply array jika Anda ingin item array dilewatkan sebagai argumen fungsi.

serius
sumber
4
Saya tidak yakin JavaScript Arraymemiliki .apply()fungsi. Saya pikir yang Anda maksud some_function.apply(this, my_array). Lihat jawaban
Kit
5

Penerapan ide serius.

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

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Richard Ayotte
sumber
Yang ini membuat hari saya menyenangkan. Membongkar daftar melalui apply, good done Pak!
mike239x
2
var one = arr[0];
var two = arr[1];
merampok waminal
sumber
1
Anda harus benar-benar menggunakan varuntuk mencegah variabel mencemari cakupan global.
Mathias Bynens
Saya hanya mengasumsikan semua variabel yang dideklarasikan :)
rob waminal
Mungkin ide yang lebih baik untuk mendeklarasikan semua vars untuk setiap cakupan sekaligus daripada memiliki dua vardeklarasi terpisah .
Mathias Bynens
2

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

Dan, dikutip dari atas halaman:

"CoffeeScript adalah bahasa kecil yang dikompilasi ke dalam JavaScript. Anggap saja sebagai saudara lelaki JavaScript yang kurang mencolok - gen yang sama, kira-kira tingginya sama, tetapi gaya yang berbeda. Terlepas dari beberapa hadiah bonus, pernyataan di CoffeeScript sesuai dengan satu -to-one dengan padanannya di JavaScript, itu hanya cara lain untuk mengatakannya. "

Jakob
sumber
1
Ini tidak menjawab pertanyaan itu. Saya menghargai bahwa CoffeeScript memiliki beberapa hal yang rapi, tetapi pertanyaannya adalah tentang Javascript.
Hovis Biddle
Tautan mati: (((
Paul Draper