JavaScript中根据键名而非索引提取对象属性的技巧

JavaScript中根据键名而非索引提取对象属性的技巧

本文旨在解决javascript中从对象数组中提取特定属性时,避免依赖属性索引的脆弱性问题。我们将探讨如何利用点表示法、方括号表示法以及对象解构等现代javascript特性,结合array.prototype.map方法,以健壮且高效的方式根据键名准确地筛选和重构数据,确保代码在属性顺序变化时依然稳定运行。

在JavaScript开发中,我们经常需要处理包含多个对象的数组,并从中提取或转换数据。一个常见的场景是,我们有一个包含多余属性的对象数组,需要将其转换为一个只包含特定关键属性的新对象数组。初学者在处理这类问题时,可能会尝试使用Object.values()结合索引来获取属性值,但这是一种不推荐的做法,因为它高度依赖于对象属性的定义顺序,一旦属性顺序发生变化,代码就会失效。

避免使用索引访问对象属性

考虑以下原始数据结构:

const items = [  {    product: 'prodOne',    quantity: 3,    sending: 100,    receiving: 50  },  {    product: 'prodTwo',    quantity: 4,    sending: 50,    receiving: 100  },  {    product: 'prodThree',    quantity: 8,    sending: 100,    receiving: 100  }];

目标是将其转换为只包含 product 和 quantity 属性的新数组:

const itemsRed = [  {    product: 'prodOne',    quantity: 3,  },  {    product: 'prodTwo',    quantity: 4,  },  {    product: 'prodThree',    quantity: 8,  }];

如果尝试使用 Object.values() 并通过索引访问,例如:

立即学习“Java免费学习笔记(深入)”;

const x = items.map(function (obj){    var prod  = Object.values(obj)[0] // 依赖于 'product' 是第一个属性    var qty = Object.values(obj)[1]   // 依赖于 'quantity' 是第二个属性    return {product: prod, quantity: qty}});

这种方法存在严重缺陷。JavaScript对象的属性在ES2015之前并没有严格的顺序保证(尽管现代引擎通常会保留插入顺序),即使保留了顺序,一旦原始对象中属性的定义顺序发生改变,上述代码就会立即失效,导致提取到错误的数据。

正确地根据键名提取属性

为了解决这个问题,我们应该直接通过属性的键名(key)来访问其值。JavaScript提供了多种健壮的方式来实现这一点。

1. 使用点表示法(Dot Notation)

这是最直观和常用的方法,通过 object.propertyName 的形式来访问属性。

const resultDotNotation = items.map(function(obj) {    const prod = obj.product;    // 直接通过键名 'product' 访问    const qty = obj.quantity;    // 直接通过键名 'quantity' 访问    return {        product: prod,        quantity: qty    };});console.log("使用点表示法:", resultDotNotation);

2. 使用方括号表示法(Bracket Notation)

当属性名包含特殊字符(如空格、连字符)或者属性名是动态生成时,可以使用方括号表示法 object[‘propertyName’]。在本例中,虽然点表示法更简洁,但方括号表示法同样有效。

const resultBracketNotation = items.map(function(obj) {    const prod = obj['product']; // 直接通过键名 'product' 访问    const qty = obj['quantity']; // 直接通过键名 'quantity' 访问    return {        product: prod,        quantity: qty    };});console.log("使用方括号表示法:", resultBracketNotation);

3. 使用对象解构(Object Destructuring)

ES6引入的对象解构语法提供了一种更简洁、更强大的方式来从对象中提取属性。这在Array.prototype.map回调函数中尤其有用。

const resultDestructuring = items.map(({ product, quantity }) => ({ product, quantity }));console.log("使用对象解构:", resultDestructuring);

代码解析:

items.map(…): map 方法会遍历 items 数组中的每个对象。({ product, quantity }): 这是回调函数参数中的对象解构。它会从当前遍历到的对象(例如 obj)中提取 product 和 quantity 这两个属性,并将它们作为独立的变量供函数体使用。=> ({ product, quantity }): 这是箭头函数的函数体。它直接返回一个新的对象字面量,其中包含解构出来的 product 和 quantity 属性。注意外层的圆括号是必需的,因为如果没有它们,JavaScript会将 { product, quantity } 解释为代码块而不是对象字面量。

完整示例与对比

下面是一个包含所有方法的完整示例,展示了它们的输出结果:

const items = [  {    product: 'prodOne',    quantity: 3,    sending: 100,    receiving: 50  },  {    product: 'prodTwo',    quantity: 4,    sending: 50,    receiving: 100  },  {    product: 'prodThree',    quantity: 8,    sending: 100,    receiving: 100  }];// 1. 使用点表示法const resultDotNotation = items.map(function(obj) {    const prod = obj.product;    const qty = obj.quantity;    return {        product: prod,        quantity: qty    };});console.log("--- 使用点表示法 ---");console.log(resultDotNotation);// 2. 使用方括号表示法const resultBracketNotation = items.map((item) => ({  product: item['product'],  quantity: item['quantity']}));console.log("n--- 使用方括号表示法 ---");console.log(resultBracketNotation);// 3. 使用对象解构 (最推荐)const resultDestructuring = items.map(({ product, quantity }) => ({ product, quantity }));console.log("n--- 使用对象解构 ---");console.log(resultDestructuring);// 验证所有方法输出结果一致console.log("n--- 验证结果一致性 ---");console.log(JSON.stringify(resultDotNotation) === JSON.stringify(resultDestructuring)); // true

注意事项与总结

健壮性: 直接通过键名访问属性是确保代码健壮性的关键。无论原始对象中属性的顺序如何,只要键名不变,代码就能正常工作。可读性: 点表示法和对象解构通常提供更好的代码可读性,尤其是在处理少量明确的属性时。简洁性: 对象解构是最简洁和现代的写法,尤其适合在map等高阶函数中使用。性能: 在大多数现代JavaScript引擎中,这些方法在性能上差异微乎其微,选择哪种主要取决于代码风格和场景需求。对于大多数应用而言,应优先考虑代码的清晰度和可维护性。

综上所述,当需要从JavaScript对象中提取特定属性时,应始终通过属性的键名进行访问,而非依赖于其在对象中的索引位置。对象解构结合Array.prototype.map提供了一种优雅、高效且健壮的解决方案,是处理此类数据转换任务的首选方法。

以上就是JavaScript中根据键名而非索引提取对象属性的技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1535979.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在服务器端安全执行用户提供JavaScript代码的策略与风险
上一篇 2025年12月21日 02:53:46
JS字符串如何转换大小写_JavaScript字符串大小写转换方法使用教程
下一篇 2025年12月21日 02:54:00

相关推荐

  • Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    在Spring Security应用中,确保自定义过滤器(如多租户过滤器)在JWT认证/授权过滤器之前正确执行至关重要。本文将深入探讨如何通过@Order注解和SecurityFilterChain配置,精确控制自定义OncePerRequestFilter的执行顺序,使其优先于Spring Sec…

    2026年9月26日 • 用户投稿
    100
  • 如何优化debian readdir的性能

    如何优化debian readdir的性能如何优化debian readdir的性能如何优化debian readdir的性能如何优化debian readdir的性能

    在Debian系统中,readdir系统调用用于读取目录内容。如果其性能表现不佳,可尝试以下优化策略: 精简目录文件数量: 尽可能将大型目录拆分成多个小型目录,降低每次readdir调用处理的项目数量。 启用目录内容缓存: 构建缓存机制,定期或在目录内容变更时更新缓存,减少对readdir的频繁调用…

    2026年9月26日 • 用户投稿
    200
  • Java微服务分布式事务实战:TCC模式与Seata框架深度整合

    Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合

    TCC模式结合Seata框架是微服务中实现分布式事务的可靠方案,通过Try-Confirm-Cancel机制将事务控制提升至业务层,Seata以@GlobalTransactional和@TwoPhaseBusinessAction注解简化事务协调,实现资源的预留、确认与回滚,解决数据一致性难题。 …

    2026年9月26日 • 用户投稿
    100
  • Java加密输出长度限制的策略与实践

    Java加密输出长度限制的策略与实践Java加密输出长度限制的策略与实践Java加密输出长度限制的策略与实践Java加密输出长度限制的策略与实践

    本文探讨了在Java中将可变长度文本加密并严格限制输出长度在100字符以内的方法。由于加密本身并非压缩,且现代密码学算法会引入IV和认证标签等额外开销,直接加密难以满足短输出要求。教程将提供预加密优化(编码与压缩)、最小化密文表示开销、充分利用存储字符集以及分段传输等策略,以平衡安全性与长度限制。 …

    2026年9月26日 • 用户投稿
    000
  • Java加密输出长度限制:挑战与多维策略

    Java加密输出长度限制:挑战与多维策略Java加密输出长度限制:挑战与多维策略Java加密输出长度限制:挑战与多维策略Java加密输出长度限制:挑战与多维策略

    本文探讨了在Java中对文本进行加密并严格限制输出长度(例如100字符)的挑战。由于现代加密算法通常会增加而非压缩数据,文章将介绍如何通过优化编码、数据压缩、最小化加密开销、高效字符存储以及分段传输等多种策略来应对这一特殊需求,确保在满足长度限制的同时兼顾安全性。 在许多应用场景中,对数据进行加密是…

    2026年9月26日 • 用户投稿
    000
  • sublime有哪些必装的插件_sublime推荐必装插件清单

    sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单

    Sublime Text通过插件可大幅提升效率,建议安装Package Control以方便管理插件;SideBarEnhancements增强侧边栏功能,支持文件快速操作;Emmet和代码片段插件提升前端开发速度,实现HTML/CSS/JS的高效编写;Git集成插件支持版本控制操作,GitGutt…

    2026年9月26日 • 用户投稿
    200
  • Java加密输出长度优化:应对API 100字符限制的策略与实践

    Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践

    本文探讨在Java中实现文本加密时,如何应对输出密文长度不超过100字符的严格限制。我们将深入理解加密算法的本质,分析其非压缩特性及额外开销,并提供一系列实用的优化策略,包括前置数据压缩、最小化加密开销、高效密文表示以及协议层面的分段传输,旨在帮助开发者在满足安全需求的同时,符合特定的API长度约束…

    2026年9月26日 • 用户投稿
    000
  • 线性代数中的满射:它与“满秩”有何关系?

    线性代数中的满射:它与“满秩”有何关系?线性代数中的满射:它与“满秩”有何关系?线性代数中的满射:它与“满秩”有何关系?线性代数中的满射:它与“满秩”有何关系?

    满射与满秩的关系取决于矩阵维度:当行数m≤列数n时,满秩(rank=min(m,n)=m)等价于满射(rank=m);当m>n时,满秩(rank=n)无法满足满射(需rank=m),故不等价。 线性代数中,一个线性变换如果是“满射”,意味着它的像(输出空间)能够完全覆盖其协同域。而矩阵的“满秩…

    2026年9月26日 • 用户投稿
    100
  • Android应用中Activity间文件路径传递与PDF加载指南

    Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南

    本文旨在解决Android应用中通过Intent在Activity间传递文件路径时常见的NullPointerException问题,尤其是在加载PDF文件场景。我们将深入分析导致此错误的原因,并提供两种安全有效的解决方案:使用getAbsolutePath()传递字符串路径,或利用Serializ…

    2026年9月26日 • 用户投稿
    1400
  • php数据库如何删除记录 php数据库DELETE操作的安全规范

    使用预处理语句可防止SQL注入,确保删除操作安全;应验证用户输入、检查ID合法性,避免直接拼接参数;通过权限校验确认数据归属,防止越权删除;建议采用软删除或二次确认机制,避免误删;DELETE必须包含WHERE条件,禁止无条件删除整表;结合事务与日志审计提升安全性。 在PHP中操作数据库删除记录时,…

    2026年9月26日
    000
  • Java中利用Comparator对自定义对象列表进行高效排序

    Java中利用Comparator对自定义对象列表进行高效排序Java中利用Comparator对自定义对象列表进行高效排序Java中利用Comparator对自定义对象列表进行高效排序Java中利用Comparator对自定义对象列表进行高效排序

    本教程详细阐述了如何在Java中利用Comparator接口对自定义对象(如带有分数的单词)的ArrayList进行排序。我们将学习如何封装数据、使用List.sort()方法结合Comparator.comparing()和.reversed()实现升序和降序排序,并提供优化字母分数计算的实用建议…

    2026年9月26日 • 用户投稿
    300
  • 时间处理最佳实践:UTC 与时区转换

    时间处理最佳实践:UTC 与时区转换时间处理最佳实践:UTC 与时区转换时间处理最佳实践:UTC 与时区转换时间处理最佳实践:UTC 与时区转换

    本文旨在阐述在应用程序中处理日期和时间的最佳实践,尤其是在 UI 和后端之间传递时间信息时。核心思想是坚持使用 UTC 作为数据存储和交换的通用标准,并在用户界面展示或特定业务逻辑需要时才进行时区转换。本文将深入探讨如何使用 java.time 库中的 Instant 和 ZonedDateTime…

    2026年9月26日 • 用户投稿
    300
  • Java中DelayQueue使用技巧

    DelayQueue适用于定时任务调度等场景,需实现Delayed接口的getDelay和compareTo方法,推荐基于System.nanoTime()计算延迟以避免系统时间跳变影响;队列无界,需监控大小并定期清理无效任务以防内存溢出;可配合线程池异步处理到期任务,消费线程应捕获异常防止中断;r…

    2026年9月26日
    200
  • 《忍者龙剑传4》现已偷跑 玩家称战斗系统非常惊艳!

    《忍者龙剑传4》现已偷跑 玩家称战斗系统非常惊艳!《忍者龙剑传4》现已偷跑 玩家称战斗系统非常惊艳!《忍者龙剑传4》现已偷跑 玩家称战斗系统非常惊艳!《忍者龙剑传4》现已偷跑 玩家称战斗系统非常惊艳!

    《忍者龙剑传4》将于10月21日正式发售,登陆ps5、xsx|s以及pc平台,并将在首发当日加入xgp游戏库。本作支持难度自定义,无论你是系列老将还是初次接触的新手,都有机会通过挑战赢得“超忍”称号。剧情方面,隼龙与八云之间的对立成为核心冲突——八云试图解除暗黑神龙的封印,而这直接违背了神龙教阻止恶…

    2026年9月26日 • 用户投稿
    100
  • sublime如何禁用拼写检查_sublime关闭拼写检查方法

    sublime如何禁用拼写检查_sublime关闭拼写检查方法sublime如何禁用拼写检查_sublime关闭拼写检查方法sublime如何禁用拼写检查_sublime关闭拼写检查方法sublime如何禁用拼写检查_sublime关闭拼写检查方法

    Sublime Text默认开启拼写检查,可用红色波浪线标记疑似错误;2. 可通过菜单临时关闭当前文件的拼写检查;3. 修改用户设置添加”spell_check”: false可永久全局关闭;4. 针对特定语言语法文件添加该配置则仅关闭对应类型文件的检查;5. 关闭后红色波浪…

    2026年9月26日 • 用户投稿
    300
  • 计算循环迭代次数并与其他类中的迭代次数进行比较的教程

    计算循环迭代次数并与其他类中的迭代次数进行比较的教程计算循环迭代次数并与其他类中的迭代次数进行比较的教程计算循环迭代次数并与其他类中的迭代次数进行比较的教程计算循环迭代次数并与其他类中的迭代次数进行比较的教程

    本文旨在解决在Java程序中统计循环迭代次数,并将其与其他方法或类中的迭代次数进行比较的问题。通过示例代码,我们将展示如何创建一个结果对象来同时返回计算结果和迭代次数,避免使用全局计数器变量,确保每次调用都能获得准确的迭代次数统计。 在程序开发中,经常需要统计循环的迭代次数,尤其是在比较不同算法的效…

    2026年9月26日 • 用户投稿
    100
  • Android Plurals 正确使用指南

    Android Plurals 正确使用指南Android Plurals 正确使用指南Android Plurals 正确使用指南Android Plurals 正确使用指南

    本文旨在详细讲解 Android 中 Plurals 的正确使用方法,避免常见的错误用法。通过示例代码和注意事项,帮助开发者理解如何利用 Plurals 实现应用的多语言支持,从而提升用户体验。本文将重点介绍如何定义和使用 Plurals 资源,以及在不同语言环境下正确显示单复数形式。 Plural…

    2026年9月26日 • 用户投稿
    100
  • sublime怎么解决高分屏下UI过小的问题_sublime界面缩放与高清屏适配方法

    sublime怎么解决高分屏下UI过小的问题_sublime界面缩放与高清屏适配方法sublime怎么解决高分屏下UI过小的问题_sublime界面缩放与高清屏适配方法sublime怎么解决高分屏下UI过小的问题_sublime界面缩放与高清屏适配方法sublime怎么解决高分屏下UI过小的问题_sublime界面缩放与高清屏适配方法

    首先修改配置文件实现高分屏适配,通过Preferences→Settings添加”ui_scale”:1.25可调整整体界面缩放,其次单独设置”font_size”:14提升代码可读性,最后利用Package Control安装Ayu等现代主题优化显示…

    2026年9月25日 • 用户投稿
    500
  • 使用正则表达式判断字符串中字符是否全部唯一

    使用正则表达式判断字符串中字符是否全部唯一使用正则表达式判断字符串中字符是否全部唯一使用正则表达式判断字符串中字符是否全部唯一使用正则表达式判断字符串中字符是否全部唯一

    本文介绍如何使用Java正则表达式来判断一个字符串中的所有字符是否都是唯一的。我们将探讨一种使用正则表达式检测字符串中是否存在重复字符的方法,并提供相应的Java代码示例。通过本文,你将学习如何利用正则表达式的强大功能来解决字符串处理中的常见问题。 在字符串处理中,经常需要判断一个字符串中的字符是否…

    2026年9月25日 • 用户投稿
    200
  • 获取物品名称并转换为字符串时出现乱码的解决方案

    获取物品名称并转换为字符串时出现乱码的解决方案获取物品名称并转换为字符串时出现乱码的解决方案获取物品名称并转换为字符串时出现乱码的解决方案获取物品名称并转换为字符串时出现乱码的解决方案

    本文旨在解决在 Minecraft Spigot 插件开发中,获取玩家放置的物品名称并尝试将其转换为字符串时出现乱码的问题。通过分析问题原因,并提供正确的代码示例,帮助开发者避免类似错误,从而更有效地获取玩家名称。 在 Spigot 插件开发中,当玩家放置方块时,我们可能需要获取该方块对应的玩家名称…

    2026年9月25日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信