App下載

在 Javascript 中如何解構(gòu)數(shù)組和對象

幼稚園生悶氣大賽總冠軍 2021-09-17 17:01:19 瀏覽數(shù) (4166)
反饋

在 Javascript 如何對數(shù)組和對象進行結(jié)構(gòu)?下面,通過本篇文章,我們一起來探索一下 Javascript 中的解構(gòu)。

定義

對于解構(gòu)賦值,沒有比 MDN 更簡潔的定義:

解構(gòu)賦值語法是一個 JavaScript 表達式,可以將數(shù)組中的值或?qū)ο笾械膶傩越獍鼮椴煌淖兞俊?/blockquote>

數(shù)組解構(gòu)

我們使用?方括號:[]?來解構(gòu)數(shù)組。 

讓我們看看我們可以使用解構(gòu)賦值的不同場景,考慮一個包含三個元素的數(shù)組,現(xiàn)在你想分別用數(shù)組中的值創(chuàng)建三個不同的變量。舊方法是使用索引為每個新變量分配數(shù)組中的值。

const arr = [1, 2, 3];
const a = arr[0]; // a = 1
const b = arr[1]; // b = 2
const c = arr[2]; // c = 3

但是,使用解構(gòu)賦值可以大大減少執(zhí)行相同任務(wù)的工作量。

const arr = [1, 2, 3];
const [a, b, c] = arr;
// a = 1, b = 2, c = 3
注意:原始陣列不受影響,保持原樣。只有賦值操作從左到右進行。

如果我們只需要數(shù)組中的兩個元素,我們可以對兩個變量使用相同的語法。數(shù)組中超過兩個元素的剩余值將被丟棄。

我們也可以根據(jù)需要使用數(shù)組中該元素的空格跳過中間元素。請參閱示例以更好地理解:

const arr = [1, 2, 3, 4];
// a = 1, b = 2
const [a, b] = arr;
// x = 2, y = 4
const [ , x,  , y] = arr;

使用解構(gòu)交換值

傳統(tǒng)上,我們可以使用臨時變量顯式交換值,然后在三個變量之間賦值和重新賦值,但現(xiàn)在我們可以使用解構(gòu)直接賦值,示例如下:

let a = 10, b = 20;

// Old way
let temp = a;
a = b;
b = temp;   // a = 20, b = 10

// Using destructuring
[a, b] = [b, a];   // a = 20, b = 10

從函數(shù)調(diào)用中接收多個值

讓我們考慮一個具有很少屬性的對象 ?restaurant?:

const restaurant = {
    name: 'La\' Pinoz Pizza',
    location: 'Ghaziabad',
    categories: ['Italian', 'Vegetarian', 'Non-Vegetarian', 'Organic'],
    starterMenu: ['Garlic Bread', 'Fries', 'Pastries'],
    mainMenu: ['Pizza', 'Pasta', 'Risotto'],
    order: function(starterIndex, mainIndex) {
        return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
    }
} 

?restaurant?對象的 order 屬性是一個函數(shù),它接受兩個參數(shù)并返回一個包含兩個值的數(shù)組。我們可以在這里使用解構(gòu),將 Array 的元素直接賦值給變量。

const [starter, mainCourse] = restaurant.order(2,1);
console.log(starter, mainCourse);
// output: Pastries Pasta

嵌套解構(gòu)

顧名思義,非常簡單,在數(shù)組中解構(gòu)數(shù)組??紤]一個帶有嵌套數(shù)組的數(shù)組:[1, 2, [3, 4]]。當(dāng)我們用這個數(shù)組分配 a,b,c 的值時,每個人都會得到分配的單個元素,即 a = 1, b = 2, c = [3,4]。如果我們想從數(shù)組 c 中分離出值,那么我們可以使用類似的解構(gòu)語法并實現(xiàn)它。

const nested = [1, 2, [3, 4]];
const [a, b, c] = nested;  // a = 1, b = 2, c = [3, 4]
const [x, , [y, z]] = nested; // x = 1, y = 3, z = 4

默認值

如果我們不知道傳入數(shù)組中包含的數(shù)據(jù),那么分配給變量的默認值是?undefined?。讓我們看一個例子并理解:

const unknownArray = [1, 5, 9];
const [a, b, c, d] = unknownArray;
console.log(a,b,c,d);
// Output: 1 5 9 undefined

對象解構(gòu)

我們使用?花括號:{}?來解構(gòu)對象。我們必須提供與對象中的屬性名稱完全匹配的變量名稱。(盡管我們還將看到一種如何使用不同變量名稱的方法)。

讓我們考慮與上面類似的?restaurant?對象,還有更多的屬性:

const restaurant = {
    nameOfRestaurant: 'La\' Pinoz Pizza',
    location: 'Ghaziabad',
    categories: ['Italian', 'Vegetarian', 'Non-Vegetarian', 'Organic'],
    starterMenu: ['Garlic Bread', 'Fries', 'Pastries'],
    mainMenu: ['Pizza', 'Pasta', 'Risotto'],
    order: function(starterIndex, mainIndex) {
        return [this.starterMenu[starterIndex], this.mainMenu[mainIndex]];
    },
    openingHours: {
        thu: {
            open: 11,
            close: 22
        },
        fri: {
            open: 10,
            close: 23
        },
        sat: {
            open: 11,
            close: 23
        }
    }
}

我們可以使用其屬性名稱來解構(gòu)?restaurant?對象,現(xiàn)在這里屬性的順序無關(guān)緊要,因為只要屬性名稱匹配就可以訪問它。

const {nameOfRestaurant, openingHours, mainMenu} = restaurant;
console.log('Name: ', nameOfRestaurant);
console.log('Opening Hours: ', openingHours);
console.log('Main Menu: ', mainMenu);

// Output:
// Name:  La' Pinoz Pizza
// Opening Hours:  {
//   thu: { open: 11, close: 22 },
//   fri: { open: 10, close: 23 },
//   sat: { open: 11, close: 23 }
// }
// Main Menu:  [ 'Pizza', 'Pasta', 'Risotto' ]

使用不同的變量名

即使我們想更改與屬性名稱不同的變量名稱,我們?nèi)匀恍枰崆爸缹傩悦Q。所以查找傳入的對象總是一個好習(xí)慣。好的,所以我們可以使用?冒號(:) ?為屬性名稱指定別名。

const {nameOfRestaurant: name, openingHours: timing, mainMenu: menu} = restaurant;
console.log('Name: ', name);
console.log('Opening Hours: ', timing);
console.log('Main Menu: ', menu);
// We get the output similar to the above output.

設(shè)置默認值

我們總是可以在解構(gòu)對象時為變量分配一個默認值。如果值存在于對象中,則將其分配給變量;如果不存在,則將默認值分配給變量。

const {nameOfRestaurant: name = 'PizzaHut', menu = [ ]} = restaurant;
// Lets assume that the restaurant object has no property with name 'nameOfRestaurant', 
// In this case the name becomes 'PizzaHut'. 
// On the other hand there is no menu property so menu is assigned with empty array.

變異值

在使用對象解構(gòu)來改變值時,我們應(yīng)該小心花括號,因為 javascript 會在遇到開放花括號時立即期望代碼塊。

為了解決這種情況,我們將解構(gòu)代碼包裝在括號內(nèi)。
let a = 11;
let b = 23;
let obj = { a: 120, b: 34 };
({ a, b } = obj);  // Important line
console.log(a, b);  // a = 120, b = 34


1 人點贊