การคลายอาร์เรย์ออกเป็นตัวแปรแยกต่างหากใน JavaScript


141

นี่เป็นปัญหาง่ายๆและฉันเคยทำมาก่อน ฉันจำไม่ได้ว่าอะไรหรือมันถูกเรียกว่าอะไร

ในหลามฉันสามารถทำสิ่งนี้:

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

ฉันจะทำสิ่งนั้นใน JavaScript ได้อย่างไร

คำตอบ:


173

ปัจจุบันนี้เป็นโซลูชันข้ามเบราว์เซอร์ที่เข้ากันได้กับ 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
destructuring มอบหมายมีการสนับสนุนอย่างเต็มที่ ณ วันนี้kangax.github.io/compat-table/es6/#test-destructuring
grandrew

20

ว่าdestructuring ที่ได้รับมอบหมาย คุณสามารถทำได้ในบางเบราว์เซอร์ด้วยไวยากรณ์ต่อไปนี้:

[one, two] = arr;

มันได้รับการสนับสนุนในบางส่วนของเบราว์เซอร์ใหม่ล่าสุดและ transpilers เช่นบาเบลและTraceur นี่เป็นคุณลักษณะที่นำมาใช้กับ ECMAScript 4 ซึ่งต่อมากลายเป็น ECMAScript Harmony ซึ่งในที่สุดก็กลายเป็น ES 2015


ดูเหมือนว่ามันเป็นส่วนหนึ่งของ ES6 (2015) ไม่ใช่ ES4? ecma-international.org/ecma-262/6.0/…
jab

@jab: ขอบคุณ! บางครั้งคำตอบเก่าเหล่านี้ได้รับการลืมเกี่ยวกับการกลายเป็นล้าสมัยแม้ว่ามันจะดูเหมือนว่างัดเพิ่มแล้วว่าข้อมูลที่จะตอบเขา :)
แอนดี้ E

19

คำถามคือค่อนข้างเก่า แต่ผมชอบที่จะโพสต์ทางเลือกนี้ (2016) วิธีการ: หนึ่งยังสามารถใช้การแพร่กระจายผู้ประกอบการ "..."

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

let xAndY = [42, 1337];
let f = function(x, y) { return x + y; };
f(...xAndY);

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']));

สิ่งนี้ทำให้วันของฉัน นำออกจากรายการได้ด้วยการใช้งานทำได้ดีมาก!
mike239x

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

1
คุณควรใช้varเพื่อป้องกันตัวแปรจากการสร้างมลภาวะระดับโลก
งัด Bynens

ฉันแค่สมมติตัวแปรทั้งหมดประกาศ :)
ปล้น waminal

มันเป็นความคิดที่ดีกว่าที่จะประกาศvars ทั้งหมดสำหรับแต่ละขอบเขตในครั้งเดียวแทนที่จะมีvarการประกาศสองครั้งแยกกัน
Mathias Bynens

2

CoffeeScript มีอยู่: http://jashkenas.github.com/coffee-script/#pattern_matching

และอ้างจากด้านบนของหน้า:

"CoffeeScript เป็นภาษาเล็ก ๆ ที่รวบรวมเป็นจาวาสคริปต์คิดว่ามันเป็นน้องชายผู้น้อยกว่าของจาวาสคริปต์ - ยีนตัวเดียวกันความสูงเท่ากัน แต่มีสไตล์ที่แตกต่างนอกเหนือจากโบนัสสารพัดงบใน CoffeeScript สอดคล้องกับ - ต่อหนึ่งซึ่งเทียบเท่ากับ JavaScript มันเป็นอีกวิธีหนึ่งในการกล่าว


1
สิ่งนี้ไม่ตอบคำถาม ฉันซาบซึ้งที่ CoffeeScript มีสิ่งที่เรียบร้อย แต่คำถามเกี่ยวกับ Javascript
Hovis Biddle

ลิงก์ตาย: ((((
พอลเดรเปอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.