JavaScript對象(Object)常用操作

創建對象

//使用對象字面量、構造函數或者Object.create()方法來創建對象// 對象字面量
const person = {name: 'John',age: 30,hobbies: ['reading', 'swimming']
};// 構造函數
function Car(make, model) {this.make = make;this.model = model;
}
const myCar = new Car('Toyota', 'Corolla');// Object.create()
const animal = {speak() {console.log(`${this.name} makes a noise.`);}
};
const dog = Object.create(animal);
dog.name = 'Buddy';

?

訪問屬性

//訪問對象屬性有兩種方式,分別是點號表示法和方括號表示法
console.log(person.name); // 'John'
console.log(person['age']); // 30// 動態訪問
const key = 'hobbies';
console.log(person[key]); // ['reading', 'swimming']

?

修改和添加屬性

//可以直接通過賦值來修改或添加對象的屬性。person.age = 31; // 修改現有屬性
person.city = 'New York'; // 添加新屬性
person['isStudent'] = false; // 方括號表示法添加屬性

?

刪除屬性

//使用delete操作符能夠刪除對象的屬性。delete person.hobbies; // 刪除hobbies屬性
console.log(person.hobbies); // undefined

?

檢查屬性是否存在

//in操作符和hasOwnProperty()方法可以檢查對象是否擁有某個屬性console.log('name' in person); // true
console.log(person.hasOwnProperty('city')); // true

?

遍歷對象

//使用for...in循環、Object.keys()、Object.values()和Object.entries()來遍歷對象// for...in循環
for (const key in person) {console.log(key, person[key]);
}// Object.keys() - 獲取所有鍵
console.log(Object.keys(person)); // ['name', 'age', 'city', 'isStudent']// Object.values() - 獲取所有值
console.log(Object.values(person)); // ['John', 31, 'New York', false]// Object.entries() - 獲取所有鍵值對
console.log(Object.entries(person)); 
// [['name', 'John'], ['age', 31], ['city', 'New York'], ['isStudent', false]]

??

凍結對象

//Object.freeze()可以阻止修改對象的屬性const frozen = Object.freeze({ x: 5 });
frozen.x = 10; // 操作被忽略(嚴格模式下會報錯)
console.log(frozen.x); // 5

?

密封對象

//Object.seal()允許修改現有屬性,但不能添加或刪除屬性。const sealed = Object.seal({ y: 10 });
sealed.y = 20; // 可以修改
sealed.z = 30; // 無效(嚴格模式下會報錯)
delete sealed.y; // 無效

?

嵌套對象

//對于嵌套對象,可以鏈式訪問和修改屬性const user = {profile: {address: {city: 'London'}}
};console.log(user.profile.address.city); // 'London'
user.profile.address.zip = 'SW1A 1AA'; // 添加嵌套屬性

?

對象方法

//對象的屬性值也可以是函數,這樣的屬性被稱為方法const calculator = {add(a, b) {return a + b;},subtract(a, b) {return a - b;}
};console.log(calculator.add(5, 3)); // 8

?

this關鍵字

//在對象方法內部,this指向調用該方法的對象const person = {name: 'Alice',greet() {console.log(`Hello, ${this.name}!`);}
};person.greet(); // 'Hello, Alice!'

?

對象的鍵與值

let obj = { "id": "1", "name": "millia", "color": "red"}/* Object.keys() */
/* 返回一個包含 javascript 對象鍵的數組如果鍵是數字,Object.keys() 函數將按排序順序返回數字鍵的數組,鍵值仍將保持與原始 javascript 對象相同的值映射*/
console.log(Object.keys(obj))   
//["id", "name", "color"]/* Object.entries() */
/* 將整個對象拆分為小數組。每個數組由 [key, value] 形式的鍵值對組成*/
console.log(Object.entries(obj))
//0: (2) ['id', '1']
//1: (2) ['name', 'millia']
//2: (2) ['color', 'red']console.log(JSON.stringify(Object.entries(obj)))   
//[["id","1"],["name","millia"],["color","red"]]for (const [key, value] of Object.entries(obj)) {console.log(`${key}: ${value}`);
}
//id: 1
//name: millia
//color: red/*for 循環*/
for(let i in obj) {console.log(i) // 鍵console.log(obj[i]) //值
}
// id
// 1
// name
// millia
// color
// red/* Object.values() */
/* 靜態方法返回一個給定對象的自有可枚舉字符串鍵屬性值組成的數組 */
console.log(Object.values(obj))
//['1', 'millia', 'red']

?

對象的合并

/* Object.assign(target,...sources) */
/* target 需要應用源對象屬性的目標對象,修改后將作為返回值sources 一個或多個包含要應用的屬性的源對象注意target對象有值還是空值{} */
let target = { a: 1, b: 2 }
let source = { b: 4, c: 5 }
console.log(Object.assign({},target, source),target,source)
//{a: 1, b: 4, c: 5} {a: 1, b: 2} {b: 4, c: 5}
console.log(target,Object.assign(target, source))
//{a: 1, b: 4, c: 5} {a: 1, b: 4, c: 5}/* 展開運算符... 解構賦值 */
/* 可以在函數調用/數組構造時,將數組表達式或者 string 在語法層面展開;還可以在構造字面量對象時,將對象表達式按 key-value 的方式展開。(注: 字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 這種簡潔的構造方式) 函數調用:myFunction(...iterableObj)字面量數組構造或字符串:[...iterableObj, '4', ...'hello', 6]構造字面量對象,進行克隆或者屬性拷貝:let objClone = { ...obj }
*/
const obj1 = { a: 1, b: 2 }
const obj2 = { b: 3, c: 4 }
const obj3 = { ...obj1, ...obj2 }
console.log(obj3)
// { a: 1, b: 3, c: 4 }

?

對象的去重

//基于單個屬性去重使用Array.reduce()或者Map來實現
const people = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 1, name: 'Charlie' } // 重復id
];// 使用Map
const uniqueById = [...new Map(people.map(person => [person.id, person])).values()];
console.log(uniqueById); // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]// 等效方法(使用reduce)
const uniqueById2 = people.reduce((acc, current) => {const x = acc.find(item => item.id === current.id);if (!x) {return acc.concat([current]);} else {return acc;}
}, []);//深度比較對象去重,當需要比較對象的所有屬性是否都相同時,可以使用JSON.stringify()或者自定義比較函數。不過要注意,JSON.stringify()有局限性,比如它無法處理函數、undefined或者循環引用的情況。
const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ name: 'Alice', id: 1 } // 屬性順序不同,但內容相同
];// 使用JSON.stringify()(簡單但有局限性)
const uniqueByStringify = [...new Set(users.map(user => JSON.stringify(user)))].map(str => JSON.parse(str));
console.log(uniqueByStringify); // 去重成功// 自定義深度比較函數
function isEqual(obj1, obj2) {if (obj1 === obj2) return true;if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) return false;const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);if (keys1.length !== keys2.length) return false;for (const key of keys1) {if (!obj2.hasOwnProperty(key) || !isEqual(obj1[key], obj2[key])) return false;}return true;
}const uniqueByDeepCompare = users.filter((current, index, self) => self.findIndex(item => isEqual(item, current)) === index
);//處理嵌套對象,如果對象包含嵌套結構,去重會更復雜一些,需要遞歸比較所有層級的屬性。
const items = [{ id: 1, details: { age: 30 } },{ id: 2, details: { age: 25 } },{ id: 1, details: { age: 30 } } // 完全重復
];// 自定義深度比較(支持嵌套對象)
function deepCompare(obj1, obj2) {if (obj1 === obj2) return true;if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) return false;const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);if (keys1.length !== keys2.length) return false;for (const key of keys1) {if (obj1[key] instanceof Date && obj2[key] instanceof Date) {if (obj1[key].getTime() !== obj2[key].getTime()) return false;} else if (!deepCompare(obj1[key], obj2[key])) {return false;}}return true;
}const uniqueItems = items.filter((current, index, self) => self.findIndex(item => deepCompare(item, current)) === index
);//基于多個屬性去重,當需要根據對象的多個屬性組合來判斷是否重復時,可以這樣實現。
const products = [{ name: 'Apple', category: 'Fruit' },{ name: 'Banana', category: 'Fruit' },{ name: 'Apple', category: 'Fruit' } // 重復組合
];const uniqueProducts = products.reduce((acc, current) => {const key = `${current.name}-${current.category}`;const isDuplicate = acc.some(item => `${item.name}-${item.category}` === key);if (!isDuplicate) {acc.push(current);}return acc;
}, []);

去重方法選擇建議

  • 基于單個屬性去重:推薦使用Map,因為它的時間復雜度是 O (n),效率較高。
  • 深度比較去重:如果對象結構簡單,可以使用JSON.stringify();如果對象結構復雜,建議使用自定義比較函數或者 Lodash。
  • 性能考慮:對于大型數組,使用Map或者Set的方法性能更好,因為它們的查找效率比Array.find()更高。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89266.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試寶典:基礎一

?? 1. Java跨平臺原理(字節碼文件與JVM) 核心機制: Java源程序(.java)編譯為與平臺無關的字節碼文件(.class),而非直接生成機器碼。字節碼由**Java虛擬機(JVM&#xf…

uniapp微信小程序:editor組件placeholder字體樣式修改

一、問題描述 微信小程序editor組件的placeholder字體默認為斜體字,官方對此沒有屬性可以設置它的樣式,并且直接在組件上設置樣式也是無效的。 二、解決方案 通過審查節點: 可以看到editor的placeholder其實是在一個偽元素上。 在頁面或者…

PhoneRescue 4.3綠色版!解決iPhone數據丟失、系統崩潰等場景

目錄 一、引言二、軟件介紹1. 研發背景與定位2. 兼容性與技術優勢 三、功能介紹1. 數據恢復功能(核心痛點解決方案)2. 系統修復功能3. 數據管理輔助 四、軟件特色1. 操作極簡,零技術門檻2. 安全可靠,零數據風險3. 高效精準&#x…

Vue 快速入門

一、Vue是什么 Vue是一款用于構建用戶界面的漸進式的JavaScript框架。 官網:Vue.js - 漸進式 JavaScript 框架 | Vue.js 其核心特性包括: 響應式數據綁定:通過 Vue 的響應式系統,數據變化會自動反映到視圖,減少手動 D…

JAVA-JWT

JWT簡介 JSON Web Token(JWT)是一個非常輕巧的規范,這個規范允許我們使用 JWT 在用戶和服務器之間傳遞安全可靠的信息。一個 JWT 實際上就是一個字符串,它由三部分組成,頭部、載荷與簽名。前兩部分需要經過 Base64 編…

UI前端大數據處理挑戰與對策:保障數據安全與隱私

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言:大數據時代的前端安全新挑戰 在數字化轉型的浪潮中,前端已從…

DTO、VO、POJO與實體類使用方案(結合Mapper.xml)

結合MyBatis的Mapper.xml文件,展示完整的層級數據流轉和數據庫操作。 1. 實體類優化(Entity) // User.java Data NoArgsConstructor AllArgsConstructor TableName("sys_user") public class User {TableId(type IdType.AUTO)pr…

開源|VDBBench 1.0正式官宣,完全復刻業務場景,支持用戶自定義數據集

宣布個好消息,大家期待已久的VDBBench 1.0更新啦。 嘗鮮鏈接: https://github.com/zilliztech/VectorDBBench/releases/tag/v1.0.0 對于這個功能的更新,我們準備了很久,也思考了很多。 因為對我們來說,VDBBench 從來不…

7,FreeRTOS列表與列表項的插入刪除

一、實驗目標 創建三個動態任務,棧空間大小均為128字。startTask、Task1、Task2。startTask僅運行一次,負責task1、task2任務的創建,startTask任務的刪除。Task1負責初始化列表、列表項123,并進行列表項的插入實驗與刪除實驗。Tas…

兩款支持3D地圖的WebGIS框架對比

前言 在當前的WebGIS技術發展中,3D地形圖的可視化已經成為一個非常重要的功能,尤其是在城市規劃、環境監測和虛擬旅游等領域中的應用。對于開發者而言,選擇一個強大且適合的WebGIS框架是實現這些功能的關鍵。目前市場上較為流行的支持3D地形…

Github 2025-06-26 Go開源項目日報Top10

根據Github Trendings的統計,今日(2025-06-26統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10PureBasic項目1使用Gitleaks保護和發現機密信息 創建周期:2203 天開發語言:Go協議類型:MIT LicenseStar數量:14645 個Fork數量:13…

C++實現魷魚、羊了個羊、掃雷、原神模擬

C++ 魷魚游戲模擬實現 魷魚游戲中的經典場景可以通過C++模擬實現,例如“紅綠燈”游戲。以下是一個簡化版本的核心代碼框架: #include <iostream> #include <thread> #include <chrono> #include <cstdlib> #include <ctime> #include <ve…

從用戶到權限:解密 AWS IAM Identity Center 的授權之道

大家好&#xff0c;今天我們來解決一個非常具體的實戰問題&#xff1a;如何讓 IAM Identity Center 中創建的用戶真正獲得 AWS 賬戶的操作權限&#xff0c;從而取代老舊的 IAM 用戶管理模式&#xff1f; 如果我們盯著用戶詳情頁&#xff0c;想找一個“附加角色”的按鈕&#x…

在 Spring Boot 中使用 MyBatis-Plus 的詳細教程

前言 在現代的 Java Web 開發中&#xff0c;Spring Boot 和 MyBatis 已經成為主流框架組合。為了提升開發效率和簡化數據庫操作&#xff0c;MyBatis-Plus&#xff08;簡稱 MP&#xff09;應運而生。它是一個 MyBatis 的增強工具&#xff0c;在 MyBatis 的基礎上只做增強不做改…

AI生成內容泛濫時代:從“袋鼠登機“視頻看AI鑒偽與游戲智能的未來

近年來&#xff0c;AI生成內容的質量突飛猛進&#xff0c;從文本到圖像再到視頻&#xff0c;幾乎達到了以假亂真的程度。近期一段"人類在飛機上吵架看呆袋鼠"的視頻在社交網絡瘋傳&#xff0c;獲得數千萬次觀看后&#xff0c;才被證實是AI生成內容&#xff0c;這一事…

為什么在linux中不能直接使用pip進行安裝

您好&#xff0c;這是一個非常深刻且關鍵的問題&#xff0c;觸及了 Linux 系統管理與 Python 開發實踐的核心原則。理解了這一點&#xff0c;您就真正開始像一位經驗豐富的開發者那樣思考了。 簡單來說&#xff0c;答案是&#xff1a;為了保護操作系統自身的穩定和完整性。 讓…

IDEA相關配置記錄

IDEA相關配置記錄 參考鏈接&#xff1a; 參考鏈接&#xff1a; 1、安裝jdk D:\Program Files\Java\jdk-21 https://blog.csdn.net/2302_81410974/article/details/142031416 2、安裝maven D:\Java\workspace-maven\apache-maven-3.9.10 . ├── LICENSE ├── NOTICE ├──…

FastGPT私有化部署完整指南

&#x1f680; FastGPT 私有化部署完整指南 &#x1f4cb; 環境要求 硬件要求 最低配置:CPU: 4核內存: 8GB存儲: 50GB網絡: 穩定互聯網連接推薦配置:CPU: 8核內存: 16GB存儲: 100GB SSD網絡: 10Mbps帶寬軟件環境 必需軟件:- Docker: > 20.10.0- Docker Compose: > 2.…

系統架構設計師論文分享-基于架構的軟件設計方法及應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司做了開發紗線MES系統的決定&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的智能化和數字化水平。我在該項目中被任命為系統架構設計師&#xff0c;全面掌管該項目的架構設計工作。本文將結…

團結引擎發布純鴻蒙應用

大家好&#xff0c;我是阿趙。 ??這里嘗試一下用團結引擎發布純鴻蒙系統的應用。 一、 安裝鴻蒙系統發布需要的組件 在團結引擎的Hub里面找到Add modules: 然后找到OpenHarmony的支持選項&#xff0c;由于我已經安裝過了&#xff0c;所以會顯示Installed&#xff0c;如果沒…