首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

对象数据的读取,看这一篇就够了!Object.keys()、Object.values()和Object.entries()用法详解;如何获取对象原型链上的属性

  • 25-02-22 02:41
  • 3024
  • 5549
blog.csdn.net

目录

一、基础的对象操作:点符号"."和方括号"[]"访问属性

二、对象中键、值及键值对重组的操作Object.keys()、Object.values()和Object.entries()

2.1、基础用法介绍

2.1.1、Object.keys(obj)

2.1.2、Object.values(obj)

2.1.3、Object.entries(obj)

2.2、开发中会遇到的复杂案例

2.2.1、数据示例

2.2.2、直接访问嵌套属性

2.2.3、使用Object.keys()获取属性键

2.2.4、使用Object.values()获取项目数组

2.2.5、使用Object.entries()获取项目键值对

2.2.6、计算项目持续时间

三、用for...in来遍历对象的所有可枚举属性,包括原型链上的属性

四、总结


一、基础的对象操作:点符号"."和方括号"[]"访问属性

  • 点符号:直接通过属性名访问对象的属性。
  • 方括号:通过属性名的字符串形式访问对象的属性,特别适用于属性名是变量或包含特殊字符的情况。

        举例:

  1. let person = {
  2. name: "Alice",
  3. age: 30
  4. };
  5. // 使用点符号访问属性
  6. console.log(person.name); // 输出: Alice
  7. // 使用方括号访问属性
  8. console.log(person['age']); // 输出: 30

二、对象中键、值及键值对重组的操作Object.keys()、Object.values()和Object.entries()

2.1、基础用法介绍

2.1.1、Object.keys(obj)

        obj为要操作的对象

        返回一个包含对象自身可枚举属性的键数组。这个方法只考虑对象自身的属性,不考虑原型链上的属性。

  1. let person = {
  2. name: "Alice",
  3. age: 30
  4. };
  5. let keys = Object.keys(user);
  6. console.log(keys); // ["name", "age"]

2.1.2、Object.values(obj)

        返回一个包含对象自身可枚举属性值的数组。

  1. let person = {
  2. name: "Alice",
  3. age: 30
  4. };
  5. let values = Object.values(user);
  6. console.log(values); // ["Alice", 30]

2.1.3、Object.entries(obj)

        返回一个给定对象自身可枚举属性的键值对数组。每个键值对是一个数组,其中第一个元素是键,第二个元素是值。

  1. let person = {
  2. name: "Alice",
  3. age: 30
  4. };
  5. let entries = Object.entries(user);
  6. console.log(entries); // [["name", "Alice"], ["age", 30]]

2.2、开发中会遇到的复杂案例

2.2.1、数据示例

        假设有一个复杂的对象,表示一个公司员工的详细信息,包括他们的个人信息、技能和项目。如下所示:

  1. let employee = {
  2. id: 1001,
  3. name: "John Doe",
  4. department: "Engineering",
  5. skills: ["JavaScript", "React", "Node.js"],
  6. projects: {
  7. project1: {
  8. name: "Project A",
  9. startDate: "2021-01-01",
  10. endDate: "2021-12-31"
  11. },
  12. project2: {
  13. name: "Project B",
  14. startDate: "2022-01-01",
  15. current: true
  16. }
  17. }
  18. };

2.2.2、直接访问嵌套属性

        常通过点符号直接获取:

  1. console.log(employee.department); // "Engineering"
  2. console.log(employee.projects.project1.name); // "Project A"

2.2.3、使用Object.keys()获取属性键

  1. let employeeKeys = Object.keys(employee);
  2. console.log(employeeKeys);
  3. //["id", "name", "department", "skills", "projects"]
  4. let projectKeys = Object.keys(employee.projects);
  5. console.log(projectKeys);
  6. //["project1", "project2"]
  7. //如果你需要遍历 employee 对象中的所有属性,包括嵌套对象的属性,你可以使用递归函数或嵌套的循环。例如,打印 employee 对象及其所有嵌套对象的所有键和值:
  8. //这个 printAllKeys 函数会递归地遍历对象的所有属性,打印出每个属性的路径(例如,projects.project1.name)。这对于调试和理解复杂数据结构非常有用。
  9. function printAllKeys(obj, prefix = '') {
  10. Object.keys(obj).forEach(key => {
  11. let newKey = prefix ? `${prefix}.${key}` : key;
  12. console.log(newKey);
  13. if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) {
  14. printAllKeys(obj[key], newKey);
  15. }
  16. });
  17. }
  18. printAllKeys(employee);

2.2.4、使用Object.values()获取项目数组

  1. let projectValues = Object.values(employee.projects);
  2. console.log(projectValues);
  3. /* 输出:
  4. [
  5. { name: "Project A", startDate: "2021-01-01", endDate: "2021-12-31" },
  6. { name: "Project B", startDate: "2022-01-01", current: true }
  7. ]
  8. */

2.2.5、使用Object.entries()获取项目键值对

  1. let projectEntries = Object.entries(employee.projects);
  2. console.log(projectEntries);
  3. /* 输出:
  4. [
  5. ["project1", { name: "Project A", startDate: "2021-01-01", endDate: "2021-12-31" }],
  6. ["project2", { name: "Project B", startDate: "2022-01-01", current: true }]
  7. ]
  8. */

2.2.6、计算项目持续时间

假设我们需要计算每个项目的持续时间(以月为单位)。

  1. let employee = {
  2. id: 1001,
  3. name: "John Doe",
  4. department: "Engineering",
  5. skills: ["JavaScript", "React", "Node.js"],
  6. projects: {
  7. project1: {
  8. name: "Project A",
  9. startDate: "2021-01-01",
  10. endDate: "2021-12-31"
  11. },
  12. project2: {
  13. name: "Project B",
  14. startDate: "2022-01-01",
  15. current: true
  16. }
  17. }
  18. };
  19. function calculateProjectDurations(employee) {
  20. let durations = Object.entries(employee.projects).map(([projectId, project]) => {
  21. let startDate = new Date(project.startDate);
  22. let endDate = project.current ? new Date() : new Date(project.endDate);
  23. let duration = ((endDate - startDate) / 1000 / 60 / 60 / 24 / 30) + 1; // 月数,四舍五入
  24. return { projectId, duration };
  25. });
  26. return durations;
  27. }
  28. let projectDurations = calculateProjectDurations(employee);
  29. console.log(projectDurations);
  30. /* 输出示例(取决于当前日期):
  31. [
  32. { projectId: "project1", duration: 12 },
  33. { projectId: "project2", duration: 17 }
  34. ]
  35. */

三、用for...in来遍历对象的所有可枚举属性,包括原型链上的属性

        使用for...in循环时,通常需要使用hasOwnProperty方法来过滤掉原型链上的属性。

  1. let person = {
  2. name: "Alice",
  3. age: 30
  4. };
  5. for (let key in user) {
  6. if (user.hasOwnProperty(key)) {
  7. console.log(key + ": " + user[key]);
  8. }
  9. }
  10. // 输出:
  11. // name: Alice
  12. // age: 30

        如果不进行过滤,则会获取原型链上的数据:

  1. function User(name, age, isAdmin) {
  2. this.name = name;
  3. this.age = age;
  4. this.isAdmin = isAdmin;
  5. }
  6. User.prototype.greeting = "Hello, I am a user"; // 这是一个可枚举属性
  7. let user = new User("Alice", 30, false);
  8. for (let key in user) {
  9. console.log(key + ": " + user[key]);
  10. }
  11. // 打印结果:
  12. // name: Alice
  13. // age: 30
  14. // isAdmin: false
  15. // greeting: Hello, I am a user

四、总结

        Object.keys()、Object.values()和Object.entries()都是利于对象操作的便捷方法,能有效提升数据处理的效率。

        更多丰富的前端内容请看:各种前端问题的技巧和解决方案

        博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览62647 人正在系统学习中
注:本文转载自blog.csdn.net的Watermelo617的文章"https://blog.csdn.net/RenGJ010617/article/details/139535663"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top