数组的迭代数组里面每个对象添加属性值_JS数组和对象循环遍历的几种实现方式...

905d18b267cdc2e681958372f9b03ce4.png

数组遍历

1. 普通for循环

let arr = [1,2,3,4,5]
for (let i = 0; i < arr.length; i++) {console.log(arr[i])
}
// 输出结果
// 1
// 2
// 3
// 4
// 5

2. 优化普通for循环

let arr = [1,2,3,4,5]
for(var j = 0,len = arr.length; j < len; j++){console.log(arr[j]);
}

3. forEach循环 (箭头函数改变this指向 手写forEach)

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

注意: forEach() 对于空数组是不会执行回调函数的。

let arr = [1,2,3,4,5]
let obj = {a:1,b:2}
arr.forEach((currentValue, index, arr) => {console.log(currentValue,index,arr,this)
}, obj)
arr.forEach(function(currentValue, index, arr){console.log(currentValue,index,arr,this)
}, obj)

forEach() 的 continue 与 break

forEach() 本身是不支持的 continue 与 break 语句的,我们可以通过 some 和 every 来实现。

使用 return 语句实现 continue 关键字的效果:

4. map遍历

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

注意: map() 不会对空数组进行检测。

注意: map() 不会改变原始数组。

语法 array.map(function(currentValue,index,arr), thisValue)
let arr = [1,2,3,4,5]
let mapResult = arr.map((currentValue, index, arr)=>{console.log(currentValue,index,arr)return currentValue * index
})
console.log(mapResult)1 0 (5) [1, 2, 3, 4, 5]
2 1 (5) [1, 2, 3, 4, 5]
3 2 (5) [1, 2, 3, 4, 5]
4 3 (5) [1, 2, 3, 4, 5]
5 4 (5) [1, 2, 3, 4, 5]
(5) [0, 2, 6, 12, 20]

forEach 和 map 的区别

forEach适合于你并不打算改变数据的时候,而只是想用数据做一些事情 – 比如存入数据库或则打印出来。

map()适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。

能用forEach()做到的,map()同样可以。反过来也是如此。

map()会分配内存空间存储新数组并返回,forEach()不会返回数据。

forEach()允许callback更改原始数组的元素。map()返回新的数组。

5. for... of

在可迭代对象(包括 ArrayMapSetStringTypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句

let arr = [1,2,3,4,5]
for (let num of arr){console.log(num)
}

对象遍历

1. for...in (不适合数组)

for in 循环会遍历原型链上的属性

可以在for-in循环的时候添加 hasOwnProperty()方法来过滤掉非自有属性

// 创建一个对象并指定其原型,bar 为原型上的属性
const obj = Object.create({bar: 'bar'
})// foo 为对象自身的属性
obj.foo = 'foo'for (let key in obj) {console.log(obj[key]) // foo, bar
}for (let key in obj) {if (obj.hasOwnProperty(key)) {console.log(obj[key]) // foo}
}

for...in 语句以任意顺序迭代对象的可枚举属性。

2. Object.keys()

Object.keys() 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).

for in 循环和 Object.keys()方法都不会返回对象的不可枚举属性。

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

Object.keys(obj).forEach((key) => {console.log(obj[key]) // foo
})

3. Object.getOwnPropertyNames()

Object.getOwnPropertyNames() 也是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性。

// 创建一个对象并指定其原型,bar 为原型上的属性
// baz 为对象自身的属性并且不可枚举
const obj = Object.create({bar: 'bar'
}, {baz: {value: 'baz',enumerable: false}
})obj.foo = 'foo'// 不包括不可枚举的 baz 属性
Object.keys(obj).forEach((key) => {console.log(obj[key]) // foo
})// 包括不可枚举的 baz 属性
Object.getOwnPropertyNames(obj).forEach((key) => {console.log(obj[key]) // baz, foo
})

4. Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols()方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性

// 给对象添加一个不可枚举的 Symbol 属性
Object.defineProperties(obj, {[Symbol('baz')]: {value: 'Symbol baz',enumerable: false}
})// 给对象添加一个可枚举的 Symbol 属性
obj[Symbol('foo')] = 'Symbol foo'Object.getOwnPropertySymbols(obj).forEach((key) => {console.log(obj[key]) // Symbol baz, Symbol foo
})

5. Reflect.ownKeys()

Reflect.ownKeys()方法是 ES2015 新增的静态方法,该方法返回对象自身所有属性名组成的数组,包括不可枚举的属性和 Symbol 属性。

Reflect.ownKeys(obj).forEach((key) => {console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
})

五种方法对比

6ba3c23ef948a3ecd6e51b845bb6e01c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blend4精选案例图解教程(三):一键拖拽

原文:Blend4精选案例图解教程&#xff08;三&#xff09;&#xff1a;一键拖拽拖拽效果&#xff0c;常规实现方法是定义MoveLeftDwon、MoveLeftUp、MouseMove事件&#xff0c;在Blend的世界里&#xff0c;实现对象的拖拽&#xff0c;可以不写一行代码&#xff0c;而且非常简单&…

redis学习之三配置文件redis.conf 的含义

摘自http://www.runoob.com/redis/redis-conf.html 安装redis之后的第一件事&#xff0c;我就开始配置密码&#xff0c;结果总是不生效&#xff0c;而我居然还没想到原因。今天突然用命令行设置了密码&#xff0c;居然可以了。然后info一下&#xff0c;看到配置文件位置才恍然大…

React Native之hardwareBackPress

1 hardwareBackPress 我们用hardwareBackPress来监听手机物理返回键 2 js那边常用写法 BackHandler.addEventListener(hardwareBackPress, this._back); 3 我们看下Android源代码分析是怎么触发到这里来的 1) ReactActivity.java里面的部分代码如下 Overridepublic void o…

python画气泡图_​用Python把图做的好看点:用Matplotlib画个好看的气泡图

我们继续来把简单的图形丢到极坐标&#xff0c;这次是气泡图和柱状图&#xff0c;临摹的对象是澎湃美数课这个图看起来很好看&#xff0c;原理其实很简单&#xff0c;把柱状图和气泡图从笛卡尔坐标系中转移到极坐标系中来就OK 我们开始本次的临摹吧 本期的主题如下&#xff1a;…

C#输入框InputBox问题

C#里面没有像VB一样的InputBox,但是像InputBox一样的控件在程序中很实用,这里有两种方法实现: 一、调用VB里的InputBox 首先添加引用Microsoft.VisualBasic,然后在命名空间中引用(using Microsoft.VisualBasic;)。 举个实例: using System; using System.Collections.Ge…

mysql为什么添加索引_当我添加新索引时,为什么MySQL中索引的基数保持不变?

如果表中只有1行,则索引的基数当然应为1.它只是计算唯一值的数量.如果您将索引视为基于存储桶的查找表(如散列),则基数是存储桶的数量.以下是它的工作原理&#xff1a;当您在一组列(a,b,c,d)上构建索引时,数据库将遍历表中的所有行,查看每行的4个列的有序四元组.假设你的表看起…

win32 注册表操作

创建键 RegCreateKeyEx int SetRecordVideoSavedDays(int newSavedDays)2 {3 HKEY hSubKey NULL;4 LONG lRet 0;5 DWORD dwType 0;6 int iRet 0;7 8 do 9 {10 if (newSavedDays < 0)11 {12 printf(&quo…

进程间通信(一)

1 消息队列 消息队列是消息的链接表 , 存放在内核中并由消息队列标识符标识。 m s g g e t用于创建一个新队列或打开一个现存的队列。 m s g s n d用于将新消息添加到队列尾端。 m s g r c v用于从队列中取消息。 调用的第一个函数通常是m s g g e t&#xff0c;其功能是打开一…

Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册

前言假设我们有三个Service类实现了同一接口&#xff0c;示例代码如下&#xff1a;public interface IService { } public class ServiceA : IService { } public class ServiceB : IService { } public class ServiceC : IService { }我们希望在运行时使用依赖注入指定其具体…

Loadrunner 接口测试方法

其实无论用那种测试方法&#xff0c;接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文&#xff0c;服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端&#xff0c;客户端接收应答报文这一个过程。一、基于通用http/html请求大家都知道LoadRun…

React Native之react-native bundle --platform android --dev false --entry-file index.js --bundle失败

1 问题 react native项目在assert目录下面生成index.android.bundle文件用下面的命令 react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/r…

pytorch forward_【Pytorch部署】TorchScript

TorchScript是什么&#xff1f;TorchScript - PyTorch master documentation​pytorch.orgTorchScript是一种从PyTorch代码创建可序列化和可优化模型的方法。任何TorchScript程序都可以从Python进程中保存&#xff0c;并加载到没有Python依赖的进程中。我们提供了一些工具来增量…

兼容ie8 rgba()用法

今天遇到了一个问题&#xff0c;要在一个页面中设置一个半透明的白色div。这个貌似不是难题&#xff0c;只需要给这个div设置如下的属性即可&#xff1a; background: rgba(255,255,255,.1); 但是要兼容到ie8。这个就有点蛋疼了。因为ie8不支持rgba()函数。下面我们总结一下rgb…

hdu水仙花

水仙花数Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 11 Accepted Submission(s) : 6 Problem Description 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff…

python中的标识符能不能使用关键字_Python中的标识符不能使用关键字

Python中的标识符不能使用关键字答&#xff1a;√智慧职教: 检查客室座椅外观良好&#xff0c;确认?无破损答&#xff1a;坐垫 靠背关于投标报价时综合单价的确定&#xff0c;下列做法中正确的是()答&#xff1a;以项目特征描述为依据确定综合单价城市总体规划调查时&#xff…

C# WPF实战项目升级了

概述之前用Caliburn.Micro搭建的WPF实战项目&#xff0c;CM框架选用了 3.0.3&#xff0c;实际上CM框架目前最新版已经到4.0。173了&#xff0c;所有很有必须升级一下项目了. 本来打算把平台框架也直接升级到.NET 6 的&#xff0c;但是项目里面很多库不支持最新的平台版本&#…

Android之通过ContentResolver获取手机图片和视频的路径和生成缩略图和缩略图路径

1 问题 获取手机所有图片和视频的路径和生成图片和视频的缩略图和缩略图路径 生成缩略图我们用的系统函数 public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Options options) {throw new RuntimeException("Stub!");} 调用如下 M…

ArcGIS Engine开发模板及C#代码

目 录 1. 模板 2. 代码 1. 模板 以下为AE开发软件自带的模板及代码,开发工具为VS 2012+ArcGIS Engine 10.2。 2. 代码 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; us…

为何解析浏览器地址参数会为null_request 包中出现 DNS 解析超时的探究

事情的起因是这样的&#xff0c;公司使用自建 dns 服务器&#xff0c;但是有一个致命缺陷&#xff0c;不支持 ipv6 格式的地址解析&#xff0c;而 node 的 DNS 解析默认是同时请求 v4 和 v6 的地址的&#xff0c;这样会导致偶尔在解析 v6 地址的时候出现超时。本文链接地址 htt…

高级iOS面试题

非标准答案 2 1: 类方法是可以直接通过类名直接调用&#xff0c;无需进行实例化对象。类方法是以开头2. 实例方法&#xff0c;需要显示实例化对象&#xff0c;为对象分配堆栈空间&#xff0c;并通过对象实例调用实例方法3. RUNTIME 是在程序运行过程动态对实例对象进行操作&…