」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 JavaScript 中的嵌套對象

了解 JavaScript 中的嵌套對象

發佈於2024-11-03
瀏覽:372

Understanding Nested Objects in JavaScript

对象是 JavaScript 开发人员所要处理的事情,不用说,这也适用于 TypeScript。 TypeScript 为您提供了多种方法来定义对象属性的类型定义。我们将在这篇文章中介绍其中的几个,从简单的示例开始,然后转向一些高级类型定义。

JavaScript 中的嵌套对象是包含其他对象或数组作为其属性的对象。这允许创建可以更有效地表示现实世界实体的复杂数据结构。
在 JavaScript 中,您可以将对象嵌套在其他对象中。这也称为对象嵌套或对象组合。对象嵌套允许您通过在对象内组织对象来创建复杂的数据结构。

创建嵌套对象

这是表示用户配置文件的嵌套对象的简单示例:

const userProfile = {
    username: "irena_doe",
    age: 30,
    contact: {
        email: "[email protected]",
        phone: {
            home: "123-456-7890",
            mobile: "987-654-3210"
        }
    },
    preferences: {
        notifications: true,
        theme: "dark"
    }
};

例如:
userProfile 对象具有用户名、年龄和联系人等属性。
contact 属性本身是一个包含电子邮件和电话的对象。
电话属性是另一个包含家庭号码和手机号码的嵌套对象。

访问嵌套对象属性

要访问嵌套对象内的属性,可以使用点表示法或方括号表示法。以下是获取用户手机号码的方法:

const mobileNumber = userProfile.contact.phone.mobile;
console.log(mobileNumber); // Output: 987-654-3210

您还可以修改嵌套属性。例如,如果您想更改主题首选项:

userProfile.preferences.theme = "light";
console.log(userProfile.preferences.theme); // Output: light

将类型与嵌套对象一起使用

使用 TypeScript 时,您可以定义嵌套对象的类型以确保类型安全。以下是如何定义 userProfile 对象的类型:

type UserProfile = {
    username: string;
    age: number;
    contact: {
        email: string;
        phone: {
            home: string;
            mobile: string;
        };
    };
    preferences: {
        notifications: boolean;
        theme: string;
    };
};

const user: UserProfile = {
    username: "irena_doe",
    age: 30,
    contact: {
        email: "[email protected]",
        phone: {
            home: "123-456-7890",
            mobile: "987-654-3210"
        }
    },
    preferences: {
        notifications: true,
        theme: "dark"
    }
};

在此 TypeScript 示例中,UserProfile 类型定义了 userProfile 对象的结构,确保所有属性都正确键入。

这是 JavaScript 中嵌套对象的另一个示例

让我们看一个代表图书馆系统的更复杂的示例,其中每本书都有各种详细信息,包括其作者、出版商和流派。
嵌套对象可以使用 type 关键字本身来定义。 TypeScript 还可以将嵌套对象的类型定义抽象为类型定义。当您不确定对象将具有多少属性但确定对象属性的类型时,可以使用索引签名

为图书馆系统定义嵌套对象

以下是针对此场景构建嵌套对象的方法:

const library = {
    name: "Central City Library",
    location: {
        address: {
            street: "123 Main St",
            city: "Central City",
            state: "CC",
            zip: "12345"
        },
        coordinates: {
            latitude: 40.7128,
            longitude: -74.0060
        }
    },
    books: [
        {
            title: "JavaScript: The Good Parts",
            author: {
                firstName: "Douglas",
                lastName: "Crockford"
            },
            publishedYear: 2008,
            genres: ["Programming", "Technology"],
            availableCopies: 5
        },
        {
            title: "Clean Code",
            author: {
                firstName: "Robert",
                lastName: "C. Martin"
            },
            publishedYear: 2008,
            genres: ["Programming", "Software Engineering"],
            availableCopies: 3
        }
    ],
    totalBooks: function() {
        return this.books.length;
    }
};

让我们来分析一下嵌套对象结构

  • 图书馆对象:代表整个图书馆,包含名称、位置和书籍等属性。
  • 位置对象:包含地址和坐标的嵌套对象。
  • 地址包括街道、城市、州和邮政编码。 坐标存储纬度和经度。
  • Books Array:保存多个书籍对象的数组,每个对象包含:
  • Title:书名。
  • 作者对象:包含作者名字和姓氏的嵌套对象。

-出版年份:书籍出版的年份。
-流派:该书所属的流派数组。
- 可用副本:表示可用副本数量的数字。

访问和操作数据

您可以通过多种方式访问​​和操作此嵌套对象。以下是如何获取第一本书的作者:

const firstBookAuthor = library.books[0].author;
console.log(`${firstBookAuthor.firstName} ${firstBookAuthor.lastName}`); 
// Output: Douglas Crockford

要将新书添加到图书馆:

library.books.push({
    title: "The Pragmatic Programmer",
    author: {
        firstName: "Andrew",
        lastName: "Hunt"
    },
    publishedYear: 1999,
    genres: ["Programming", "Career"],
    availableCopies: 4
});

使用对象中的方法

您还可以利用对象中定义的方法。例如获取图书总数:

console.log(library.totalBooks()); // Output: 3

此示例说明了如何使用嵌套对象来创建更全面的结构来表示复杂的数据,例如图书馆系统。通过将相关信息组织在一起,您可以轻松地以有意义的方式管理数据并与数据交互。

另一个嵌套示例

为了提高代码组织和可维护性,您可以将嵌套对象抽象为单独的类型。这种方法允许您单独定义 Caterer 类型并在 Train 类型中使用它。以下是在 TypeScript 中执行此操作的方法:

// Define the type for Caterer
type Caterer = {
    name: string;   // Name of the catering company
    address: string; // Address of the catering company
    phone: number;   // Phone number of the catering company
};

定义列车类型
接下来,我们将定义 Train 类型,它将使用 Caterer 类型作为其餐饮属性。

// Define the type for Train
type Train = {
    model: string;                // Model of the train
    trainNumber: string;          // Unique train number
    timeOfDeparture: Date;        // Departure time
    timeOfArrival: Date;          // Arrival time
    caterer: Caterer;             // Reference to the Caterer type
};

火车对象的示例

现在,我们可以创建 Train 类型的实例,包括 Caterer 详细信息。

// Example of a Train object
const train: Train = {
    model: "Shinkansen N700",
    trainNumber: "S1234",
    timeOfDeparture: new Date("2024-10-25T09:00:00Z"),
    timeOfArrival: new Date("2024-10-25T11:30:00Z"),
    caterer: {
        name: "Gourmet Train Catering",
        address: "123 Culinary Ave, Tokyo",
        phone: 1234567890,
    },
};

这种方法的好处是:

  • 可重用性:Caterer 类型可以在代码的其他部分重用,例如不同的交通类型(例如飞机、公共汽车)。
  • 清晰度:分离 Caterer 类型使 Train 类型更清晰、更容易理解。
  • 可维护性:如果Caterer的结构发生变化,只需在一处更新即可。

通过将嵌套对象抽象为单独的类型,您可以增强 TypeScript 代码的组织性和清晰度。这种方法可以实现更好的可重用性和可维护性,从而更容易管理复杂的数据结构。

让我们回顾一下

嵌套对象是 JavaScript 中的一项强大功能,允许组织复杂的数据结构。

通过使用嵌套对象,您可以创建更有意义的数据表示,使您的代码更易于理解和维护。此外,在处理这些复杂对象时,使用 TypeScript 可以帮助增强结构和类型安全性。

版本聲明 本文轉載於:https://dev.to/irenejpopova/understanding-nested-objects-in-javascript-4b31?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-14
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-07-14
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-07-14
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-14
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-07-14
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-07-14
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-07-14
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-07-14
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-14
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-07-14
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-14
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-14
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-14
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了一種更優雅的方法: $ old_sectio...
    程式設計 發佈於2025-07-14
  • input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It?

output: 解決“Warning: mysqli_query() 參數應為 mysqli 而非 resource”錯誤的解析與修復方法
    input: Why Does "Warning: mysqli_query() expects parameter 1 to be mysqli, resource given" Error Occur and How to Fix It? output: 解決“Warning: mysqli_query() 參數應為 mysqli 而非 resource”錯誤的解析與修復方法
    mysqli_query()期望參數1是mysqli,resource給定的,嘗試使用mysql Query進行執行MySQLI_QUERY_QUERY formation,be be yessqli:sqli:sqli:sqli:sqli:sqli:sqli: mysqli,給定的資源“可能發...
    程式設計 發佈於2025-07-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3