前言

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

遍历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. Elasticsearch 分片集群原理、搭建、与SpringBoot整合

    单机es可以用,没毛病,但是有一点我们需要去注意,就是高可用是需要关注的,一般我们可以把es搭建成集群,2台以上就能成为es集群了.集群不仅可以实现高可用,也能实现海量数据存储的横向扩展. 新的阅读体 ...

  2. oracle创建和删除序列

    创建序列语法: CREATE SEQUENCE 序列名 [START WITH n] [INCREMENT BY n] [{MINVALUE n}] [{MAXVALUE n|NOMAXVALUE}] ...

  3. Python爬虫系统化学习(3)

    一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的. 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过 ...

  4. 正月十五吃汤圆CountDownLatch

    CountDownLatch实际应用 今天是正月十五,给大家拜个晚年啦! 元宵节是中国传统节日,吃汤圆不能少啊,今天我们统计下"叫练"吃汤圆时间,并用代码模拟下叫练吃汤圆!其中用到 ...

  5. 翻译:《实用的 Python 编程》02_07_Objects

    目录 | 上一节 (2.6 列表推导式) | 下一节 (3 从程序组织) 2.7 对象 本节介绍有关 Python 内部对象模型的更多详细信息,并讨论一些与内存管理,拷贝和类型检查有关的问题. 赋值 ...

  6. PHP Webshell List

    目录 基础类 编码替换 无关键字函数类型 躲避检测记录 MySQL写入一句话 基础类 很容易被扫描.检测出来 <?php @eval($_GET['phpcode']);?> <?p ...

  7. 数组的常用方法之split

    今天我们来聊一下数组的常用方法:split 返回值:一个新数组. 1.该方法可以直接调用不传任何值,则会直接将字符串转化成数组. var str = 'I love Javascript'; cons ...

  8. HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)

    bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...

  9. 记录PHP post提交表单导入mysql中文乱码的问题

    记录记录PHP post提交表单导入mysql中文乱码的问题 关于乱码,这是个糟糕的问题!涉及到很多地方 解决思路:程序所涉及的环境字符集不一致导致 mysql出现乱码一般是mysql数据库内部的字符 ...

  10. 字符串匹配-BF算法和KMP算法

    声明:图片及内容基于https://www.bilibili.com/video/av95949609 BF算法 原理分析 Brute Force 暴力算法 用来在主串中查找模式串是否存以及出现位置 ...