前言

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

遍历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. kvm-PLE代码分析

    Linux源码版本: 5.3.0 相关数据结构 #define KVM_DEFAULT_PLE_GAP 128 // ple_gap #define KVM_VMX_DEFAULT_PLE_WINDO ...

  2. IDEA中引用不到HttpServlet的解决方案

    原文链接:https://blog.csdn.net/xiaozaizi666/article/details/87805564

  3. Django Admin 实现三级联动的示例代码(省市区)===>小白级

    一  使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7  (Windows x86-64 executable in ...

  4. Codeforces Global Round 13

    比赛地址 A(水题) 题目链接 题目: 给出一个\(01\)序列,有2种操作:1.将某个位置取反:2.询问\(01\)序列中第\(k\)大的数 解析: 显然维护1的数目即可 #include<b ...

  5. C++核心篇

    C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓. 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统 ...

  6. apicloud编译所需的ios证书的获取方法

    在我们通过apicloud或hbuilderX这些工具打包ios应用的时候,需要一个ios证书. 那么我们如何生成这个ios证书呢?网上介绍的方法都是需要使用mac电脑,然后用mac电脑的钥匙串访问的 ...

  7. HDOJ-1358(字符串压缩+KMP)

    Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...

  8. 【python】虚拟环境管理之 virtualenv 、pipenv

    虚拟环境介绍 应用场景 python在安装第三方包时,会被pip安装到/site-package下,如果我们需要同时维护多个python项目,那这些项目都会共用一个python,而真实需求是多个项目之 ...

  9. BIMFACE二次开发SDK 开源C#版

    [ BIMFace.SDK.CSharp ] 是基于微软.NET 技术封装的用于 BIMFACE 二次开发的通用类库.其中封装了BIMFace服务端API,包含基础API.文件上传API.文件转换AP ...

  10. css盒布局-省份选择盘的实现

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...