JavaScript - 嵌套解構

你好,未來的JavaScript魔法師!今天,我們將踏上一段令人興奮的旅程,進入嵌套解構的領域。別擔心這聽起來有點令人卻步——我保證,到了這堂課結束時,你會像專家一樣解構嵌套結構!

JavaScript - Nested Destructuring

嵌套解構

在我們深入探讨之前,先快速複習一下什麼是解構。想像你有一個滿滿的好東西的盒子(一個對象或一個數組),你想取出特定的項目。解構就像是伸手進那個盒子,一次就抓到你需要的東西。很棒吧?

現在,嵌套解構就是我們有盒子裡面還有盒子,我們還想從那些內部盒子中抓取項目。這就像是數據的俄羅斯套娃!

讓我們從一些簡單的例子開始,然後逐步深入。

嵌套對象解構

想像你正在開發一款電子遊戲,你有一個包含一些嵌套信息的玩家對象。以下是我們如何解構它:

const player = {
name: "Mario",
game: "Super Mario Bros",
details: {
age: 35,
occupation: "Plumber"
}
};

const { name, details: { age } } = player;

console.log(name);  // 輸出: Mario
console.log(age);   // 輸出: 35

在這個例子中,我們伸手進player對象,從頂層抓取name,然後深入details對象以抓取age。就像是說,“給我名字,順便幫我從details裡抓取年齡。”

讓我們試一個更複雜的:

const game = {
title: "Final Fantasy VII",
platform: "PlayStation",
characters: {
protagonist: {
name: "Cloud Strife",
weapon: "Buster Sword"
},
antagonist: {
name: "Sephiroth",
weapon: "Masamune"
}
}
};

const { title, characters: { protagonist: { name: heroName, weapon: heroWeapon } } } = game;

console.log(title);       // 輸出: Final Fantasy VII
console.log(heroName);    // 輸出: Cloud Strife
console.log(heroWeapon);  // 輸出: Buster Sword

在這裡,我們深入兩個層次!我們從頂層抓取title,然後進入characters,再進入protagonist,最後抓取nameweapon。我們還將它們重命名為heroNameheroWeapon以提高清晰度。

嵌套數組解構

數組也可以是嵌套的!讓我們看一個例子:

const coordinates = [10, 20, [30, 40]];

const [x, y, [z, w]] = coordinates;

console.log(x);  // 輸出: 10
console.log(y);  // 輸出: 20
console.log(z);  // 輸出: 30
console.log(w);  // 輸出: 40

在這個情況下,我們正在解構一個嵌套數組。我們coordinates數組的第三個元素本身是一個數組,所以我們使用另一對方括號來解構它。

讓我們試一個更複雜的:

const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];

const [[a, b, c], [d, e, f], [g, h, i]] = matrix;

console.log(a, e, i);  // 輸出: 1 5 9

在這裡,我們正在解構一個3x3的矩陣。每個解構模式中的嵌套數組對應於我們矩陣中的一行。

對象內數組 - 嵌套解構

現在,讓我們來混合一下。如果我們有一個對象內有一個數組會怎麼樣?

const student = {
name: "Alice",
age: 20,
grades: [85, 90, 92]
};

const { name, grades: [firstGrade, ...otherGrades] } = student;

console.log(name);         // 輸出: Alice
console.log(firstGrade);   // 輸出: 85
console.log(otherGrades);  // 輸出: [90, 92]

在這個例子中,我們從對象中抓取name,然後解構grades數組。我們單獨獲取第一個成績,然後使用擴展運算符(...)來將其餘成績收集到一個新數組中。

數組內對象 - 嵌套解構

最後但同樣重要的是,讓我們看看如何解構數組中的對象:

const team = [
{ name: "John", role: "Developer" },
{ name: "Jane", role: "Designer" },
{ name: "Jack", role: "Manager" }
];

const [{ name: firstName }, , { role }] = team;

console.log(firstName);  // 輸出: John
console.log(role);       // 輸出: Manager

在這裡,我們正在解構數組中的第一個和第三個對象。我們從第一個對象中抓取name(並將其重命名為firstName),跳過第二個對象(注意額外的逗號),然後從第三個對象中抓取role

方法總結

這裡是一個總結我們所涵蓋方法的表格:

方法 描述 示例
對象解構 從對象中提取值 const { name, age } = person;
數組解構 從數組中提取值 const [x, y] = coordinates;
嵌套對象解構 從嵌套對象中提取值 const { details: { age } } = player;
嵌套數組解構 從嵌套數組中提取值 const [x, [y, z]] = nestedArray;
混合解構 結合對象和數組解構 const { grades: [firstGrade] } = student;
重命名 將解構的值分配給不同的變量名 const { name: firstName } = person;
擴展運算符 將剩餘的值收集到一個數組中 const [first, ...rest] = numbers;

至此,各位!你剛剛通過嵌套解構升級了你的JavaScript技能。記住,熟練才能完美,所以不要害怕在自創代碼中嘗試這些概念。快樂編程!

Credits: Image by storyset