js for in遍历对象_JS中轻松遍历对象属性的几种方式

2023-11-06

原文: https:// dmitripavlutin.com/how- to-iterate-easily-over-object-properties-in-javascript/
译者:前端小智

为了保证的可读性,本文采用意译而非直译。

想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你!

自身可枚举属性

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。如果对象的键-值都不可枚举,那么将返回由键组成的数组。

这是合理的,因为大多数时候只需要关注对象自身的属性。

来看看一个对象拥有自身和继承属性的例子,Object.keys()只返回自己的属性键:

let simpleColors = {
  colorA: 'white',
  colorB: 'black'
};
let natureColors = {
  colorC: 'green',
  colorD: 'yellow'
};
Object.setPrototypeOf(natureColors, simpleColors);
Object.keys(natureColors); // => ['colorC', 'colorD']
natureColors['colorA'];    // => 'white'
natureColors['colorB'];    // => 'black'
Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null。

Object.keys(natureColors)返回natureColors对象的自身可枚举属性键:['colorC','colorD']

natureColors包含从simpleColors原型对象继承的属性,但是Object.keys()函数会跳过它们。

Object.values()Object.entries() 也都是返回一个给定对象自身可枚举属性的键值对数组

// ...
Object.values(natureColors); 
// => ['green', 'yellow']
Object.entries(natureColors);
// => [ ['colorC', 'green'], ['colorD', 'yellow'] ]

现在注意与for..in语句的区别,for..in不仅可以循环枚举自身属性还可以枚举原型链中的属性

// ...
let enumerableKeys = [];
for (let key in natureColors) {
  enumerableKeys.push(key);
}
enumerableKeys; // => ['colorC', 'colorD', 'colorA', 'colorB']

enumerableKeys数组包含natureColors自身属性键: 'colorC''colorD'

另外for..in也遍历了从simpleColors原型对象继承的属性

2. Object.values() 返回属性值

Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用 for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

来个例子,使用Object.keys()收集keys,然后通过 key 去对象取对应的值:

let meals = {
  mealA: 'Breakfast',
  mealB: 'Lunch',
  mealC: 'Dinner'
};
for (let key of Object.keys(meals)) {
  let mealName = meals[key];
  // ... do something with mealName
  console.log(mealName);
}
// 'Breakfast' 'Lunch' 'Dinner'

meal是一个普通对象。 使用Object.keys(meals)和枚举的for..of循环获取对象键值。

代码看起来很简单,但是,let mealName = meals[key] 没有多大的必要,可以进一步优化,如下:

let meals = {
  mealA: 'Breakfast',
  mealB: 'Lunch',
  mealC: 'Dinner'
};
for (let mealName of Object.values(meals)) {
  console.log(mealName);
}
// 'Breakfast' 'Lunch' 'Dinner'

因为Object.values(meals)返回数组中的对象属性值,所以可以直接在 for..of 中简化。 mealName直接在循环中赋值。

Object.entries()

Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。

Object.entries() 返回键值对数组,如 [ [key1, value1], [key2, value2], ..., [keyN, valueN] ]

可能直接使用这些键值对不怎么方便,但可以通过数组解构赋值方式访问键和值就变得非常容易,如下所示:

let meals = {
  mealA: 'Breakfast',
  mealB: 'Lunch',
  mealC: 'Dinner'
};
for (let [key, value] of Object.entries(meals)) {
  console.log(key + ':' + value);
}
// 'mealA:Breakfast' 'mealB:Lunch' 'mealC:Dinner'

如上所示,因为 Object.entries()返回一个与数组解构赋值兼容的集合,因此不需要为赋值或声明添加额外的行。

当普通对象要转换成 MapObject.entries() 就很有用,因为Object.entries() 返回的格式与Map构造函数接受的格式完全相同:(key,value)

使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象。

来个例子,让人缓缓:

let greetings = {
  morning: 'Good morning',
  midday: 'Good day',
  evening: 'Good evening'
};
let greetingsMap = new Map(Object.entries(greetings));
greetingsMap.get('morning'); // => 'Good morning'
greetingsMap.get('midday');  // => 'Good day'
greetingsMap.get('evening'); // => 'Good evening'
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

有趣的是,Map提供了与Object.values()Object.entries() 等效的方法(只是它们返回Iterators),以便为Map实例提取属性值或键值对:

  • Map.prototype.values() 等价于Object.values()
  • Map.prototype.entries() 等价于Object.entries()

map是普通对象的改进版本,可以获取 map 的大小(对于普通对象,必须手动获取),并使用任意对象类型作为键(普通对象使用字符串基元类型作为键)。

让我们看看返回.values().entries()map的方法:

// ...
[...greetingsMap.values()];
// => ['Good morning', 'Good day', 'Good evening']
[...greetingsMap.entries()];
// => [ ['morning', 'Good morning'], ['midday', 'Good day'], 
//      ['evening', 'Good evening'] ]

注意,greetingsMap.values()greetingsMap.entries()返回迭代器对象。若要将结果放入数组,扩展运算符是必要的。

对象属性的顺序

JS 对象是简单的键值映射,因此,对象中属性的顺序是微不足道的, 在大多数情况下,不应该依赖它。

在ES5和早期标准中,根本没有指定属性的顺序。

然而,从ES 6开始,属性的顺序是基于一个特殊的规则的,除非特指按照时间排序。通过两个新方法Object.getOwnPropertyNamesReflect.ownKeys来编写示例讲解这一属性排序规则。

  • 数字:当属性的类型时数字类型时,会按照数字的从大到小的顺序进行排序;
  • 字符串:当属性的类型是字符串时,会按照时间的先后顺序进行排序;
  • Symbol:当属性的类型是Symbol时,会按照时间的先后顺序进行排序。

如果需要有序集合,建议将数据存储到数组或Set中。

总结

Object.values()Object.entries() 是为JS开发人员提供新的标准化辅助函数的另一个改进步骤。

Object.entries()最适用于数组解构赋值,其方式是将键和值轻松分配给不同的变量。 此函数还可以轻松地将纯JS对象属性映射到Map对象中。、

注意,Object.values()Object.entries()返回数据的顺序是不确定的,所以不要依赖该方式。

交流

干货系列文章汇总如下,觉得不错点个Star,欢迎 加群 互相学习。

https:// github.com/qq449245884/ xiaozhi

我是小智,公众号「大迁世界」作者,对前端技术保持学习爱好者。我会经常分享自己所学所看的干货,在进阶的路上,共勉!

关注公众号,后台回复福利,即可看到福利,你懂的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js for in遍历对象_JS中轻松遍历对象属性的几种方式 的相关文章

  • 基于fpga的车牌识别系统(已上板实现,完整系统)

    基于fpga的车牌识别系统 已上板实现 完整系统 modelsim仿真代码 可以上板验证 有完整文档 开发板 正点原子达芬奇Artix 7 FPGA开发板A7 Xilinx XC7A35T 1 设计概要 针对车牌识别项目 车牌定位的准确与否
  • C# 清空数组Array.Clear

    using System using System Collections using System Collections Generic using UnityEngine public class ClearArrayText Mon
  • 【H5】 移动端的基本事件

    H5 移动端的基本事件 一 基础事件 1 PC端事件 onclick 鼠标点击触发 onmousedown 鼠标按下触发 onmousemove 鼠标移动触发 onmouseup 鼠标抬起触发 2 移动端触屏事件 ontouchstart
  • hcip脱产班01天

    桌面云 半条命 CS 射击类游戏 CF穿越火线 2M 4M土豪开网吧 电子游戏厅 网吧 方正主机 纯平大屁股显示器 液晶薄酷睿i7 i9 组装电脑 性价比高 奔腾4处理器央视做广告 主机箱 主板 内存 电源风扇 cpu等等物理硬件 有没有可
  • python使用PyInstaller库打包exe

    前言 python制作了一个小程序 想打包成exe怎么办 这篇博客 教你打包python制作的小程序 下载PyInstaller 首先 我们先按住电脑键盘上的window键 然后按R键 记住要同时按住喔 会弹出以下框 然后我们输入cmd 点
  • 关于quicktime

    前两天一直在做一个关于生化实验的教学视频 用premiere做的 本来拍摄的视频素材是mov格式的 这种格式的文件比较大 而且不能导入premiere的 只有转换成mpg格式的 本来的素材是640 480 但转换格式后就变成384 288
  • Swiper轮播图在Vue框架中的运用

    要在Vue中运用Swiper需要下载Swiper插件 在命令行cmd 可以cd 根目录 输入 npm install vue awesome swiper save 下载成功后 查看package json中是否存在 在mian js中全局
  • dll调用nodejs的回调函数

    nodejs使用ffi调用dll dll中有回调函数调用js中的方法 c语言中cdll h文件 extern C typedef void JsCall int index 这个就是要传入的类型结构 extern declspec dlli
  • 监控项目里的流媒体服务器,监控项目里的流媒体服务器

    监控项目里的流媒体服务器 内容精选 换一换 共享型和独享型负载均衡算法 支持以下几种调度算法 加权轮询算法 根据后端服务器的权重 按顺序依次将请求分发给不同的服务器 它用相应的权重表示服务器的处理性能 按照权重的高低以及轮询方式将请求分配给
  • QT设置ToolButton按钮的样式

    QToolButton min width 80px min height 32px QToolButton color rgb 255 255 255 min height 20 border style solid border top
  • 巴比特

    摘要 据 科创板日报 7 月 11 日报道 北京市经济和信息化局党组书记 局长姜广智在接受记者采访时表示 北京经信局将在算力供给层面提升中长期算力供给能力 加快建设海淀区北京人工智能公共算力 朝阳区北京数字经济算力中心等重点项目 尽快形成算
  • Pandas-连接合并函数merge()

    一 merge函数用途 pandas中的merge 函数类似于SQL中join的用法 可以将不同数据集依照某些字段 属性 进行合并操作 得到一个新的数据集 二 merge 函数的具体参数 用法 DataFrame1 merge DataFr
  • C++_面向对象_1

    设计一个圆形类 Circle 和一个点类 Point 计算点和圆的关系 class Circle public int x int y int radius class Point public int x int y void judge
  • SS626V100 SDK安装编译osdrv问题汇总

    文章目录 前言 1 开发环境 2 在 linux 服务器上安装交叉工具链 2 1 安装 aarch64 mix410 linux tgz 2 2 安装 cc riscv32 cfg11 musl 20211008 elf tar gz 2
  • react,umi,antd-pro的layout封装过程

    import React from react import Layout Form Icon from antd import isEqual from lodash isEqual 深度比较对象 import memoizeOne fr
  • TIOBE 8 月编程语言:C、Java 差距拉大,R 语言盛行

    编程语言社区 TIOBE 最新发布了 8 月编程语言排行榜 相比上个月 本月 TIOBE 指数整个体变化并不大 C 语言依然保持强劲地增长势头 与第二名 Java 之间差距逐月增大 从上个月相差 1 35 的份额逐步增长到 2 55 的差额
  • 数据分析学习之路——(八)分类算法介绍

    前面几篇文章都是从数据分析介绍讲到描述统计分析 其实数据分析还需要使用机器学习的相关知识用来建立不同的分析模型 最终对数据信息进行深入的分析和挖掘 在实际工作当中 我们需要对数据进行特征分析 并且从数据中获取有价值的信息 并且为数据产品的市
  • 时不我待,拥抱趋势,开源IM项目OpenIM技术简介

    坚持开源 开源的理念是基于共享 合作和透明的原则 将软件 代码等知识资源公开并允许他人使用 修改和重新分发 以促进创新和发展 以下是几个开源的优点 创新 开源可以促进创新 通过让其他人改进或扩展已有的代码或项目 不断推动技术的进步 透明 开
  • C# TCP/IP网络数据传输及实现

    C TCP IP网络数据传输及实现 一 概念简述 1 什么是OSI 和TCP IP 2 什么是套接字Socket 3 TCP 和 UDP 4 IP MAC PORT 1 IP地址 2 MAC地址 3 Port端口号 二 UDP上位机的实现

随机推荐

  • 静态集合类

    如HashMap LinkedList等等 如果这些容器为静态的 那么它们的生命周期与程序一致 则容器中的对象在程序结束之前将不能被释放 从而造成内存泄漏 生命周期长的对象持有短生命周期对象的引用 尽管短生命周期的对象不再使用 但是因为长生
  • 服务器上部署scrapy爬虫项目

    爬爬们 如果你已经开始部署项目了 那么你肯定也已经写好了完整的爬虫项目 恭喜你 你很优秀 今天忙了小半天的服务器部署 跟大家分享一些心得 首先我们要有一台服务器 不好意思 这是废话 略过 安装python 下载安装包 好习惯可以自己创建文件
  • Acwing 897. 最长公共子序列

    f i j 表示所有在第一个序列的前i个字母中出现 且在第二个序列的前j个字母中出现的子序列中的最大个数 include
  • canvas在图片上做标记,可以单一也可以多个

  • docker 安装mongo数据库

    1 pull镜像 docker pull mongo 4 2 创建目录 mkdir p mongodb datadb chmod 777 mongodb datadb 3 运行 准备好目录之后 就可以开始运行 Docker 镜像了 dock
  • AI,v3,百度人脸识别库上传---node

    config有必要的grant type client id client secret var https require https var request require request var qs require querystr
  • The mbstring extension is missing. Please check your PHP configuration.

    在安装完毕wamp程序后 启动后访问phpmyadmin 出现错误 The mbstring extension is missing Please check your PHP configuration 解决方案 在php ini中修改
  • LRU算法的详细介绍与实现

    1 背景 LRU least recently used 最近最少使用算法 是一种内存数据淘汰策略 使用常见是当内存不足时 需要淘汰最近最少使用的数据 LRU常用语缓存系统的淘汰策略 2 LRU原理 LRU最早实在操作系统接触到这个算法的
  • Python Day6-元组-操作-拷贝

    Python元组 操作 拷贝 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组中的元素也不能被删除 但可以删除整个元组 元组使用小括号 列表使用方括号 元组创建 只需要在括号中添加元素 并使用逗号隔开即可 1 元组的定义
  • 五人合伙最佳股份分配_老板要懂的股权合伙,懂股权者懂人心,合理分配得人心...

    1 合伙人股份分配协议分红 两人合伙 出钱不出力 出钱又出力 股份这样算 两人合伙开公司 A出资60万 不干活 B出资40万 全职无休 他们的股份该怎么计算 如果按资金占总股比例为60 人力占总股比例为40 来分配股权 A的资金股就是60万
  • Xmrig挖矿木马排查过程,xmrig占用大量CPU

    1 通过top发现xmrig占用了大量cpu 2 通过网上搜索发现是挖矿木马 3 尝试直接kill发现杀死之后又会自动重启 4 查找find name xmrig 文件 或者程序信息 ps aux grep xmrig 找到安装目录并将其删
  • Caffe:CPU模式下使用Intel MKL

    转自 https blog csdn net 10km article details 52724477 下载安装Intel MKL 打开这里Intel Math Kernel Library Intel MKL 点击 Get This L
  • MySQL索引机制(详细+原理+解析)

    MySQL索引机制 永远年轻 永远热泪盈眶 一 索引的类型与常见的操作 前缀索引 MySQL 前缀索引能有效减小索引文件的大小 提高索引的速度 但是前缀索引也有它的坏处 MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀
  • SDL教程零基础入门 简单操作 day1

    1 0 SDL 简介 文章目录 1 0 SDL 简介 1 1 什么是 SDL 1 2 SDL 可以做什么 2 在VS上获取和安装 SDL 2 1 SDL2库下载 2 2 安装SDL2 2 3 在Visual Studio中使用SDL 3 S
  • 浏览器播放rtsp视频流:2、ffmpeg转hls播放(go后端利用hls做简单视频直播)

    浏览器播放rtsp视频流 2 ffmpeg转hls播放 go后端利用hls做简单视频直播 文章目录 浏览器播放rtsp视频流 2 ffmpeg转hls播放 go后端利用hls做简单视频直播 1 前言 2 wsl安装ffmpeg并转换rtsp
  • Android性能优化之应用瘦身(APK瘦身)

    关于作者 CSDN内容合伙人 技术专家 从零开始做日活千万级APP 专注于分享各领域原创系列文章 擅长java后端 移动开发 人工智能等 希望大家多多支持 目录 一 导读 二 概览 2 1 apk组成 三 优化方向 3 1 源代码 3 1
  • Leetcode[数组] 买卖股票的最佳时机 II - 贪心算法

    0 题目描述 leetcode原题链接 买卖股票的最佳时机 II 1 贪心算法 class Solution def maxProfit self prices List int gt int maxprofit 0 for i in ra
  • C# 委托监控属性变量

    C 委托监控属性变量 一 委托 二 示例 三 参考 四 总结 一 委托 C 的委托类似函数指针 可以用于定义回调方法 一个委托可以代理多个被调的方法 二 示例 using System using System Collections Ge
  • QT 在Windows下显示中文乱码的问题

    前一段时间刚刚使用qt在显示表格数据的时候 发现输出中文是乱码的 比如在显示字符串加上变量输出的的时候一般在MFC方法有很多 但是在QT上初始化字符串加上变量的话就得这么写 QString 第 1跟 arg 16 i 但是这样的话 中文就会
  • js for in遍历对象_JS中轻松遍历对象属性的几种方式

    原文 https dmitripavlutin com how to iterate easily over object properties in javascript 译者 前端小智 为了保证的可读性 本文采用意译而非直译 想阅读更多