JavaScript遍历对象方法总结
前言
本篇内容将按照下图展开:

遍历Object
Object最常见的遍历方法方法就是使用for...in...,但其有一定的局限性,比如只能遍历可枚举属性。虽然Object无法直接使用for循环和forEach,但是经过Reflect.ownKeys / Object.getOwnPropertyNames / Object.getOwnPropertySymbols / Object.keys等方法转换直接得到Object中key值的集合后,是可以通过for循环和forEach来遍历的。
| 方法 | 获取属性种类 |
|---|---|
| Object.keys | 可枚举属性 |
| Object.getOwnPropertySymbols | Symbol属性 |
| Object.getOwnPropertyNames | 可枚举属性和不可枚举属性 |
| Reflect.ownKeys | 可枚举属性、不可枚举属性和Symbol属性 |
比如现在有个对象,其中有3个属性,分别是可枚举属性、不可枚举属性和Symbol属性:
let person = {
name : 'xiaoming'
}
person[Symbol('sex')] = 'man';
Object.defineProperty(person, 'age', {
value : 18,
writable: true,
configurable: false,
enumerable: false
})
使用for...in...遍历
for(let key in person){
console.log('key : ' + key + ' , value : ' + person[key]);
}
输出结果:

使用Object.keys + for循环遍历
let keys2 = Object.keys(person);
for(let index = 0, length = keys2.length; index < length; index++){
let key = keys2[index];
let value = person[key];
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:

使用Object.getOwnPropertyNames + for循环遍历
let names = Object.getOwnPropertyNames(person);
for(let index = 0, length = names.length; index < length; index++){
let key = names[index];
let value = person[key];
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:

使用Object.getOwnPropertySymbols + for循环遍历
let symbols = Object.getOwnPropertySymbols(person);
for(let index = 0, length = symbols.length; index < length; index++){
let key = symbols[index];
let value = person[key];
typeof key === 'symbol' ? key = Symbol.prototype.toString.call(key) : '';
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:

使用Reflect.ownKeys + for循环遍历
let keys = Reflect.ownKeys(person);
for(let index = 0, length = keys.length; index < length; index++){
let key = keys[index];
let value = person[key];
typeof key === 'symbol' ? key = Symbol.prototype.toString.call(key) : '';
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:

遍历Array
遍历Array可以使用for循环,也可以使用for...in...和for...of...,并且Array的原型中还有forEach函数和map函数可用来遍历Array对象。
测试数据:
let arr = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5'];
使用for...in...遍历
for(let index in arr){
console.log('index : ' + arr[index]);
}
输出结果:

使用for循环遍历
for(let index = 0, length = arr.length; index < length; index += 1){
console.log('index : ' + arr[index]);
}
输出结果:

使用Array.prototype.forEach遍历
Array.prototype.forEach.call(arr, (value) => {
console.log('value : ' + value);
})
输出结果:

使用Array.prototype.map遍历
Array.prototype.map.call(arr, (value) => {
console.log('value : ' + value);
})
输出结果:

map方法会根据原数组中的每个元素调用函数后返回的数据创建一个新数组。
使用for...of...遍历
for(let value of arr){
console.log('value : ' + value);
}
输出结果:

遍历Map
遍历Map一般是两种,一是直接使用for...of...或者Map.prototype.forEach,二是通过Map.prototype.entries / Map.prototype.keys / Symbol.iterator获取Map对象的迭代器,再通过for...of...来遍历迭代器。
测试数据:
let map = new Map();
map.set('key_1', 'value_1');
map.set('key_2', 'value_2');
map.set('key_3', 'value_3');
map.set('key_4', 'value_4');
map.set('key_5', 'value_5');
使用for...of...遍历
for(let [key, value] of map){
console.log('key : ' + key + ' value : ' + value);
}
输出结果:

使用Map.prototype.forEach遍历
Map.prototype.forEach.call(map, (value, key) => {
console.log('key : ' + key + ' value : ' + value);
})
输出结果:

使用Map.prototype.entries + for...of...遍历
let iterator = Map.prototype.entries.call(map);
for(let item of iterator){
console.log('item : ' + item);
}
输出结果:

使用Map.prototype.keys + for...of...遍历
let keys = Map.prototype.keys.call(map);
for(let key of keys){
console.log('key : ' + key + ' value : ' + Map.prototype.get.call(map, key));
}
输出结果:

使用Symbol.iterator + for...of...遍历
let iterator2 = map[Symbol.iterator]();
for(let item of iterator2){
console.log('item : ' + item);
}
输出结果:

遍历Set
遍历Set和遍历Map差不多,Map有的方法Set都有,但是有一个差别:Map是以键值对的形式去存储数据的,其中键是唯一;而Set存储的只有值,其值是唯一的。
遍历Set一般也是两种,一是直接使用for...of...或者Set.prototype.forEach,二是通过Set.prototype.values / Symbol.iterator获取Map对象的迭代器,再通for...of...来遍历迭代器
像Set.prototype.entries / Set.prototype.keys虽然也可以达到遍历Set对象的效果,但是由于其将value当做key,笔者感觉这两个方法与上文中Map.prototype.entries / Map.prototype.keys逻辑上差别不大,故而不再赘述。
测试数据:
let set = new Set();
set.add('value_1');
set.add('value_2');
set.add('value_3');
set.add('value_4');
set.add('value_5');
使用for...of...遍历
for(let item of set){
console.log('item : ' + item);
}
输出结果:

使用Set.prototype.forEach遍历
let iterator = Set.prototype.values.call(set);
for(let value of iterator){
console.log('value : ' + value);
}
输出结果:

使用Set.prototype.values + for...of...遍历
let iterator = Set.prototype.values.call(set);
for(let value of iterator){
console.log('value : ' + value);
}
输出结果:

使用Symbol.iterator + for...of...遍历
let iterator2 = set[Symbol.iterator]();
for(let value of iterator2){
console.log('value : ' + value);
}
输出结果:

尾言
笔者才疏学浅,慌忙之下难免有遗漏或是疏忽,如有错误之处,还望各位看官不吝赐教,笔者在此感谢。
参考
作者:Fatman
博客园地址:https://www.cnblogs.com/liujingjiu
CSDN地址:https://blog.csdn.net/qq_35508835
版权归Fatman所有,欢迎保留原文链接进行转载:)
JavaScript遍历对象方法总结的更多相关文章
- javaScript遍历对象、数组总结(转载)
javaScript遍历对象.数组总结 转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...
- JavaScript 遍历对象、数组总结
在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用! javaScript遍历对象总结 1.使用Objec ...
- JavaScript遍历对象4种方法和遍历数组的3种方式 代码
//遍历对象 4种方法 //Object.keys(obj).forEach() console.log("keys...遍历</br>") var obj1 = { ...
- JavaScript遍历对象-总结一
原生JavaScript 遍历 1.for 循环遍历 let array1 = ['a','b','c']; for (let i = 0;i < array1.length;i++){ con ...
- JavaScript 遍历对象查找指定的值并返回路径
问:JavaScript 如何查找对象中某个 value 并返回路径上所有的 key? let obj = { key1: 'str1', key2: { key3: 'str3' }, key4: ...
- ES6遍历对象方法
ES6 一共有 5 种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). let obj = {a:1,b:2,c:3 ...
- javaScript遍历对象、数组总结
javaScript遍历对象总结 1.使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj = {'0':'a ...
- javascript遍历对象的属性
不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...
- JavaScript Math 对象方法
Math 对象方法 方法 描述 abs(x) 返回数的绝对值. acos(x) 返回数的反余弦值. asin(x) 返回数的反正弦值. atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值 ...
随机推荐
- 主键策略+mybayisPlus自动增长
主键策略: 1.自动增长 有一点小缺陷:例如当一张表里的数据过于庞大时我们会进行分表操作,若是用自动增长策略,那么除了第一张表外的每一张表都必须知道上一张的表的的最后ID值.这个操作便会造成效率的变低 ...
- 物联网网关开发:基于MQTT消息总线的设计过程(上)
道哥的第 021 篇原创 目录 一.前言 二.网关的作用 2.1 指令转发 2.2 外网通信 2.3 协议转换 2.4 设备管理 2.5 边沿计算(自动化控制) 三.网关内部进程之间的通信 3.1 网 ...
- 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接
1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...
- SpringBoot2.2.5整合ElasticSearch7.9.2
1:前言 为什么是SpringBoot2.2.5,不是其他的SpringBoot版本,原因有两个: 1:SpringBoot2.2.0以上才能支持ElasticSearch7.x版本. 2:Sprin ...
- centos7.5+nginx+php急速配置
centos7.5+nginx+php急速配置 centosnginxphp 更新系统以及添加源 yum update yum -y install epel-release 安装php以及配置 yu ...
- linux 几种传输文件的方式
SimpleHTTPServer + wget 如果线上可以直连线下的话,在线上使用wget访问线下的文件服务器: web的方法,比较灵活,使用完要尽快关闭这个服务: cd temp temp$ py ...
- MySQL--WHERE专题
MySQL进阶----过滤条件 select * from ... where ...; 通常我们并不需要查看一个表的所有行,我们需要查看的是具备某种条件的行.前面MySQL使用的基础学习中,就使用过 ...
- 用c++解一元二次方程
解方程 github项目地址 这两天得知初二的表妹学了一元二次方程,听说还不会解,我就想着试试用C语言编写解方程. 一元二次方程 用公式法 这种方法效果很好: #include"funct. ...
- 记录PHP post提交表单导入mysql中文乱码的问题
记录记录PHP post提交表单导入mysql中文乱码的问题 关于乱码,这是个糟糕的问题!涉及到很多地方 解决思路:程序所涉及的环境字符集不一致导致 mysql出现乱码一般是mysql数据库内部的字符 ...
- Java流程控制:用户交互Scanner
java.util.Scanner工具类获取用户输入语法:Scanner scanner = new Scanner(System.in);通过Scanner类的next()与nextLine()方法 ...