前言

本篇内容将按照下图展开:

遍历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遍历对象方法总结的更多相关文章

  1. javaScript遍历对象、数组总结(转载)

    javaScript遍历对象.数组总结  转载来源 https://www.cnblogs.com/chenyablog/p/6477866.html 在日常工作过程中,我们对于javaScript遍 ...

  2. JavaScript 遍历对象、数组总结

    在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用!   javaScript遍历对象总结     1.使用Objec ...

  3. JavaScript遍历对象4种方法和遍历数组的3种方式 代码

    //遍历对象 4种方法 //Object.keys(obj).forEach() console.log("keys...遍历</br>") var obj1 = { ...

  4. JavaScript遍历对象-总结一

    原生JavaScript 遍历 1.for 循环遍历 let array1 = ['a','b','c']; for (let i = 0;i < array1.length;i++){ con ...

  5. JavaScript 遍历对象查找指定的值并返回路径

    问:JavaScript 如何查找对象中某个 value 并返回路径上所有的 key? let obj = { key1: 'str1', key2: { key3: 'str3' }, key4: ...

  6. ES6遍历对象方法

    ES6 一共有 5 种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). let obj = {a:1,b:2,c:3 ...

  7. javaScript遍历对象、数组总结

        javaScript遍历对象总结 1.使用Object.keys()遍历 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性). var obj = {'0':'a ...

  8. javascript遍历对象的属性

    不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...

  9. JavaScript Math 对象方法

    Math 对象方法 方法 描述 abs(x) 返回数的绝对值. acos(x) 返回数的反余弦值. asin(x) 返回数的反正弦值. atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值 ...

随机推荐

  1. idea没有错误提示的解决方法(一直处于错误分析中)

    仅作记录,以防再次发生却不记得. 原文链接:https://blog.csdn.net/a755199443/article/details/90084316 问题描述:idea没有自动报错.例如随便 ...

  2. 将项目加载到tomcat中的时候报错:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules

    转自:http://jingwang0523.blog.163.com/blog/static/9090710320113294551497/ 最近在用eclipse做项目,新建项目时什么都贪新,用最 ...

  3. TkMybatis添加对象后返回数据的id

    在实体类的id属性上加上下面的注解 //导入的包import javax.persistence.GeneratedValue; @GeneratedValue(generator = "J ...

  4. 基于element-ui封装一个Table模板组件

    大家在做后台管理系统的时候,写的最多的可能就是表格页面了,一般分三部分:搜索功能区.表格内容区和分页器区.一般这些功能都是使用第三方组件库实现,比如说element-ui,或者vuetify.这两个组 ...

  5. JavaScript:什么是回调?

    翻译练习 原博客地址:JavaScript: What the heck is a Callback? 在6分钟内通过简单的例子学习和理解回调的基本原理. 什么是回调? 简单地说:回调就是一个在另一个 ...

  6. 看动画轻松学会 Raft 算法

    由于 Paxos 算法过于晦涩难懂且难以实现,Diego Ongaro 提出了一种更易于理解和实现并能等价于 Paxos 算法的共识算法 - Raft 算法. 因为 Raft 算法清晰易懂越来越多的开 ...

  7. 巧用 -webkit-box-reflect 倒影实现各类动效

    在很久之前的一篇文章,有讲到 -webkit-box-reflect 这个属性 -- 从倒影说起,谈谈 CSS 继承 inherit -webkit-box-reflect 是一个非常有意思的属性,它 ...

  8. HDOJ-1260(动态规划水题)

    Tickets HDOJ-1260 #include<bits/stdc++.h> using namespace std; const int maxn=2003; int n; int ...

  9. MyBatis(四):自定义持久层框架优化

    本文所有代码已上传至码云:https://gitee.com/rangers-sun/mybatis 修改IUserDao.UserMapper.xml package com.rangers; im ...

  10. NIO三大组件之Buffer

    什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...