JS 中 Object.keys() 和 Object.values() 的深度解析与应用

文章目录

  • 前言
    • 一、Object.keys() 和 Object.values() 基础
      • 1. Object.keys()
      • 2. Object.values()
    • 二、与 Object.entries() 的对比
    • 三、实际应用场景
      • 1. 遍历对象属性
      • 2. 判断对象是否为空
      • 3. 对象与数组的转换
      • 4. 动态属性操作
      • 5. 过滤对象属性
  • 总结


前言

在 JavaScript 开发中,操作对象(Object)是日常任务之一。Object.keys()Object.values() 是两个常用的内置方法,用于获取对象的键或值。虽然它们看起来简单,但在实际开发中有许多值得探讨的细节和应用场景。本文将深入解析这两个方法,并结合实际案例展示它们的用法。


一、Object.keys() 和 Object.values() 基础

1. Object.keys()

Object.keys() 方法返回一个由给定对象的所有可枚举自身属性的键(key)组成的数组。

	const obj = { a: 1, b: 2, c: 3 };const keys = Object.keys(obj);console.log(keys); // 输出: ['a', 'b', 'c']

特点

  • 返回的是数组。
  • 仅包含对象自身的可枚举属性(不包括原型链上的属性)。
  • 属性顺序遵循对象的属性遍历顺序(ES2015 规范:数字键按升序排列,其他键按插入顺序排列)。

2. Object.values()

Object.values() 方法返回一个由给定对象的所有可枚举自身属性的值(value)组成的数组。

	const obj = { a: 1, b: 2, c: 3 };const values = Object.values(obj);console.log(values); // 输出: [1, 2, 3]

特点

  • 返回的是数组。
  • 仅包含对象自身的可枚举属性。
  • 属性顺序与 Object.keys() 一致。

二、与 Object.entries() 的对比

除了 Object.keys()Object.values(),还有一个相关的方法 Object.entries(),它返回一个由对象的键值对组成的数组。

	const obj = { a: 1, b: 2, c: 3 };const entries = Object.entries(obj);console.log(entries); // 输出: [['a', 1], ['b', 2], ['c', 3]]

对比

  • Object.keys(obj)['a', 'b', 'c']
  • Object.values(obj)[1, 2, 3]
  • Object.entries(obj)[['a', 1], ['b', 2], ['c', 3]]

三、实际应用场景

1. 遍历对象属性

通常我们会使用 for...in 循环遍历对象,但 for...in 会遍历原型链上的属性。使用 Object.keys()Object.values() 可以更安全地遍历对象自身的属性。

	const obj = { a: 1, b: 2, c: 3 };// 使用 Object.keys() 遍历键Object.keys(obj).forEach(key => {console.log(`${key}: ${obj[key]}`);});// 使用 Object.values() 遍历值Object.values(obj).forEach(value => {console.log(value);});

2. 判断对象是否为空

通过检查 Object.keys(obj).length 是否为 0,可以判断对象是否为空。

	function isEmpty(obj) {return Object.keys(obj).length === 0;}	 console.log(isEmpty({})); // trueconsole.log(isEmpty({ a: 1 })); // false

3. 对象与数组的转换

Object.keys()Object.values() 可以用于对象与数组之间的转换。

	// 对象转数组(键或值)const obj = { a: 1, b: 2, c: 3 };const keysArray = Object.keys(obj); // ['a', 'b', 'c']const valuesArray = Object.values(obj); // [1, 2, 3]	 // 数组转对象(需要额外逻辑)const keys = ['a', 'b', 'c'];const values = [1, 2, 3];const newObj = Object.fromEntries(keys.map((key, index) => [key, values[index]]));console.log(newObj); // { a: 1, b: 2, c: 3 }

4. 动态属性操作

结合 Object.keys()Object.values(),可以动态操作对象的属性。

	const user = { name: 'Alice', age: 25, role: 'admin' };// 动态更新属性Object.keys(user).forEach(key => {if (key === 'age') {user[key] += 1; // 年龄加 1}});console.log(user); // { name: 'Alice', age: 26, role: 'admin' }

5. 过滤对象属性

可以通过 Object.keys() 获取键,然后过滤键或值。

	const obj = { a: 1, b: 2, c: 3, d: 4 };// 过滤出值大于 2 的属性const filteredObj = Object.fromEntries(Object.entries(obj).filter(([key, value]) => value > 2));console.log(filteredObj); // { c: 3, d: 4 }

总结

Object.keys()Object.values() 是 JavaScript 中操作对象的强大工具,它们提供了简洁的方式获取对象的键或值。以下是它们的几个核心用途:

  1. 遍历对象属性:更安全地遍历对象自身的属性。
  2. 判断对象是否为空:通过检查 Object.keys(obj).length
  3. 对象与数组的转换:在对象和数组之间灵活转换。
  4. 动态属性操作:结合其他方法动态操作对象。
  5. 过滤对象属性:根据条件过滤属性。

在实际开发中,合理使用这些方法可以提升代码的可读性和可维护性。希望本文能帮助你更好地理解和应用 Object.keys()Object.values()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIP(BFD)

一、前言 随着网络应用的广泛部署,网络发生故障极大可能导致业务异常。为了减小链路、设备故障对业 务的影响,提高网络的可靠性,网络设备需要尽快检测到与相邻设备间的通信故障,以便及时采取措施,保证业务正常进行。BFD(Bidirectional Forwarding Detection,双向转发检测)提供…

Webpack其他插件

安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…

【Linux网络】网络层

网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…

跨域的几种方案

因为浏览器出于安全考虑&#xff0c;有同源策略。也就是说&#xff0c;如果协议、域名、端口有一个不同就是跨域&#xff0c;Ajax 请求会失败。 我们可以通过以下几种常用方法解决跨域的问题 JSONP JSONP 的原理很简单&#xff0c;就是利用 <script> 标签没有跨域限制…

基于EFISH-SCB-RK3576/SAIL-RK3576的智能安检机技术方案‌

&#xff08;国产化替代J1900的全场景技术解析&#xff09; 一、硬件架构设计‌ ‌核心处理模块‌ ‌异构计算架构‌&#xff1a; ‌四核Cortex-A72&#xff08;2.3GHz&#xff09;‌&#xff1a;运行X光图像重建算法&#xff08;FDK反投影&#xff09;&#xff0c;支持双能谱…

MQ防重复消费----去重表结合 Spring AOP 切面编程,抽象封装成通用幂等注解

以下内容包含针对 NoMQDuplicateConsumeAspect 的深度面试问答、消息队列重投递触发场景、AOP 切面编程扩展&#xff0c;以及基于已有实现的关键要点与步骤总结。文中所有论断均引用多源资料&#xff0c;以助于您在面试与实战中全面展示对幂等消费切面及消息重投的理解。 一、深…

[:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用

prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) # [1, hidden_dim] prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) 主要作用是通过将 prompt_embedding 与 attention_weights 相乘后再按指…

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…

java连数据库

一、准备工作 ​​安装MySQL数据库​​ 确保已安装MySQL服务器并启动服务 ​​下载JDBC驱动​​ 官方驱动&#xff1a;MySQL Connector/JMaven依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactI…

【生态信息】开源软件全方位解析

开源软件(0pen Source Software&#xff0c;0ss)是指其源代码可以公开发布、查看、使用和修改的软件。这一概念的核心在于开放性和共享性&#xff0c;允许开发者自由地使用、修改、分发以及改进软件。开源软件通常遵循特定的开源许可证&#xff0c;这些许可证确保了软件的自由使…

探秘 DeerFlow:字节跳动开源的科研创作魔法盒!

1.前言 字节跳动于2025年5月9日开源了名为DeerFlow的全新Deep Research项目&#xff0c;该项目基于LangStack框架&#xff0c;旨在通过人工智能技术简化科研和内容创作流程。DeerFlow整合了语言模型、网络搜索、爬虫和Python代码执行等多种工具&#xff0c;支持深度研究、MCP集…

机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值

机器学习第十一讲&#xff1a;标准化 → 把厘米和公斤单位统一成标准值 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、买菜…

less中使用 @supports

在Less中使用supports supports 是CSS的条件规则&#xff0c;用于检测浏览器是否支持特定的CSS属性或值。在Less中&#xff0c;你可以像在普通CSS中一样使用supports&#xff0c;同时还能利用Less的特性来增强它。 基本用法 /* 检测浏览器是否支持display: flex */ supports …

LeetCode Hot100 (1/100)

目录 一、有关数组和动态数组的排序&#xff08;sort函数&#xff09; 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算​ 2. 安全获取数组长度&#xff08;C17 起&#xff09;​ 3.vecto…

通过MCP让LLM调用系统接口

场景 MCP的出现大大丰富了LLM的功能&#xff0c;对于存量系统&#xff0c;我们希望能让模型调用已有的接口&#xff0c;以最小的成本让AI能够获取系统内部数据。因此我们开发了一个名为http-api-call的MCP Server&#xff0c;来支持模型到内部API的调用 实现方案 使用用标准…

基于Transformer的多资产收益预测模型实战(附PyTorch实现与避坑指南)

基于Transformer的多资产收益预测模型实战(附PyTorch模型训练及可视化完整代码) 一、项目背景与目标 在量化投资领域,利用时间序列数据预测资产收益是核心任务之一。传统方法如LSTM难以捕捉资产间的复杂依赖关系,而Transformer架构通过自注意力机制能有效建模多资产间的联…

养生:打造健康生活的全方位策略

在生活节奏不断加快的当下&#xff0c;养生已成为提升生活质量、维护身心平衡的重要方式。从饮食、运动到睡眠&#xff0c;再到心态调节&#xff0c;各个方面的养生之道共同构建起健康生活的坚实基础。以下为您详细介绍养生的关键要点&#xff0c;助您拥抱健康生活。 饮食养生…

轻型汽车鼓式液压制动器系统设计

一、设计基础参数 1.1 整车匹配参数 参数项数值范围整备质量1200-1500kg最大设计车速160km/h轮胎规格195/65 R15制动法规要求GB 12676-2014 1.2 制动性能指标 制动减速度&#xff1a;≥6.2m/s&#xff08;0型试验&#xff09; 热衰退率&#xff1a;≤30%&#xff08;连续10…

无法更新Google Chrome的解决问题

解决问题&#xff1a;原文链接&#xff1a;【百分百成功】Window 10 Google Chrome无法启动更新检查&#xff08;错误代码为1&#xff1a;0x80004005&#xff09; google谷歌chrome浏览器无法更新Chrome无法更新至最新版本&#xff1f; 下载了 就是更新Google Chrome了

【AAAI 2025】 Local Conditional Controlling for Text-to-Image Diffusion Models

Local Conditional Controlling for Text-to-Image Diffusion Models&#xff08;文本到图像扩散模型的局部条件控制&#xff09; 文章目录 内容摘要关键词作者及研究团队项目主页01 研究领域待解决问题02 论文解决的核心问题03 关键解决方案04 主要贡献05 相关研究工作06 解决…