首页 > 其他分享 >js数组遍历方法及应用,看这篇就够了

js数组遍历方法及应用,看这篇就够了

时间:2024-03-26 09:30:53浏览次数:18  
标签:pre arr 遍历 console cur 这篇 js let 数组

背景:日常开发中处理数组常用到的遍历方法,看这篇就够了

目录

数组遍历方法

for

最基本的循环结构,通常用于遍历数组,可以使用break终止循环

let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
	// i 下标
	// arr[i] 每个元素
    console.log(arr[i]);
}

forEach

用于执行数组中的每个元素的回调函数。不能在其内部使用break或return语句来终止遍历

let arr = [1, 2, 3, 4, 5];
arr.forEach(function(value, index) {
    console.log(value);
})

for…of

ES6引入的新特性,用于遍历可迭代对象,如数组

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

map

对数组的每个元素执行回调函数,并返回包含结果的新数组

let arr = [1, 2, 3, 4, 5];
let newArr = arr.map(function(value, index) {
    return value * 2;
});
console.log(newArr); // [2, 4, 6, 8, 10]

filter

测试数组的每个元素是否符合某个条件,并返回符合条件的所有元素的新数组

let arr = [1, 2, 3, 4, 5];
let newArr = arr.filter(function(value, index) {
    return value > 3;
});
console.log(newArr); // [4, 5]

for…in

不推荐用于数组遍历,因为它遍历的是键名,对于非常大的数组可能会有问题

let arr = [1, 2, 3, 4, 5];
for (let index in arr) {
    console.log(arr[index]);
}

reduce

对数组的所有元素调用指定的回调函数并最终返回一个值
功能较强大,例如:

求和、求积

let arr = [1, 2, 3, 4, 5];
let sum = arr.reduce(function(accumulator, currentValue) {
	// return accumulator * currentValue; // 求积
    return accumulator + currentValue; // 求和
}, 0);
console.log(sum); // 15

数组去重

let arr = [2,3,2,5,5,22,31]
let newArr = arr.reduce((pre, cur) => {
  if(!pre.includes(cur)){
    pre.push(cur)
  }
  return pre
},[])
console.log(newArr) // [2, 3, 5, 22, 31]

计算数组中每个元素出现的次数

let objArr = ['张三', '李四', '王五', '李四', '张三']
let newObj = objArr.reduce((pre, cur)=>{
  if(cur in pre){
    pre[cur] ++
  }else{
    pre[cur] = 1
  }
  return pre
},{})
console.log(newObj) // {张三: 2, 李四: 2, 王五: 1}

将二维数组转化为一维

let arr = [[1,2],[2,3],[22,33]]
let newObj = arr.reduce((pre,cur) => {
  return pre.concat(cur)
},[])
console.log(newObj)  // [1, 2, 2, 3, 22, 33]

将多维数组转化为一维

let arr = [[1,2],[2,[22,33]]]
let objFn = function (arr){
  return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? objFn(cur) : cur) ,[])
}
console.log(objFn(arr)) // [1, 2, 2, 22, 33]

对象里的属性求和

let objArr = [{id: 1, num: 2},{id: 2, num: 5},{id: 3, num: 7}]
let newObjArr = objArr.reduce((pre, cur)=>{
  return pre + cur.num
}, 0)
console.log(newObjArr) // 14

按对象属性给数组分组

let objArr = [
	{sex: '男', name: '张三'},
	{sex: '女', name: '小红'},
	{sex: '男', name: '李四'},
	{sex: '女', name: '小丽'}
]
function arrBy(arr, property){
  return arr.reduce((pre, cur)=>{
    let key = cur[property]
    if(!pre[key]){
      pre[key] = []
    }
    pre[key].push(cur)
    return pre
  }, {})
}
console.log(arrBy(objArr, 'sex'))

在这里插入图片描述

简单对比

  • 当你需要修改数组时使用map
  • 需要过滤数组时使用filter
  • 需要计算数组总和使用reduce
  • 而简单遍历操作则可以使用for循环或者forEach,不考虑性能,foreach相对更优雅
  • 由于for…in…得到的是key,故常用来遍历对象
  • for…of…得到的是val,可以用来遍历数组

for和forEach谁的效率更高(面试可能会问)?

let for_arr=new Array(9999999).fill(0);
console.time('for');
for(let i=0;i<for_arr.length;i++){}
console.timeEnd('for');

let foreach_arr=new Array(9999999).fill(0);
console.time('foreach');
foreach_arr.forEach(ele => {})
console.timeEnd('foreach');

在这里插入图片描述
for效率相对更高,forEach相对优雅

  • forEach每次循环都会声明一个函数,for则不需要
  • 在 for 循环中,可以通过定义一个本地变量(如var len = arr.length)将数组长度缓存起来,避免多次访问 arr.length 属性导致的性能损失。
    需要注意的是,虽然 for 循环比 forEach 循环更快,但在实际应用中,在性能方面的差别通常不会太大。所以具体使用哪个,需要结合实际情况分析

如果有不对的地方欢迎留言交流,
当然如果对你有帮助,赏个三连

标签:pre,arr,遍历,console,cur,这篇,js,let,数组
From: https://blog.csdn.net/lzz123987csdn/article/details/136946804

相关文章

  • 属性遍历那些事儿:从入门到精通,笑谈间掌握技巧
    1.属性的分类普通属性原型属性不可枚举属性Symbol属性静态属性??我们先来看看下面这个对象。constsymbolIsAnimal=Symbol.for("pro_symbol_attr_isAnimal");constsymbolSay=Symbol.for("pro_symbol_method_say");constsymbolSalary=Symbol.for("ins_symbol_a......
  • nestJs中 Guards ,Interceptors ,Pipes ,Controller ,Filters的执行顺序
    执行顺序:Guards(守卫):Guards是最先执行的中间件,用于确定是否允许请求继续处理。Guards在请求被路由到控制器之前执行,通常用于身份验证、角色检查或权限验证。如果Guards返回一个布尔值 false 或者抛出一个异常,请求处理流程将终止,不会执行后续的Pipes、Interceptors或控......
  • [附源码]计算机毕业设计高校教材管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高校教育资源的不断扩充和教育体系的日益复杂化,高效的教材管理变得尤为重要。一个专业的高校教材管理系统能够实现教材信息的集中管理、库存状态实时监控、......
  • [附源码]计算机毕业设计大学生创新项目管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高等教育的不断发展,大学生创新项目成为培养学生创新能力和实践能力的重要途径。有效的项目管理对于确保创新项目的顺利进行和高质量完成至关重要。然而,目前......
  • [附源码]计算机毕业设计疫情下高校学生离校系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍疫情的突发和持续影响使得高校学生离校管理面临前所未有的挑战。为了确保校园疫情防控的有效进行,同时保障学生的健康安全和合理流动,一个计算机毕业设计的疫情下......
  • Nodejs沙盒逃逸
    Buffer在较早一点的node.js版本中(8.0之前),当Buffer的构造函数传入数字时,会得到与数字长度一致的一个Buffer,并且这个Buffer是未清零的。8.0之后的版本可以通过另一个函数Buffer.allocUnsafe(size)来获得未清空的内存。注:关于BufferJavaScript语言自身只有字......
  • js逆向–知乎之5分钟速通版(无视jsvmp)
    js逆向–知乎之5分钟速通版(无视jsvmp)声明:文章内容仅供学习参考,严禁用于商业用途,否则由此产生一切后果与作者无关,如有侵权请联系作者进行删除。日期:2024.03.25前言:本次逆向学习的目标是知乎首页内容接口。这次采用的方法思路清奇,虽然简单,但是绝对快速有效!小白专属奇......
  • js代码的循环
      上次我们学了条件语句及switch的应用,现在我们学js代码循环的知识。什么是?循环是重复的去执行代码,分别是:for循环、while循环、do-while循环、continue循环和break循环,接下来我们逐条分析。 一、for循环语法:for(初始值;执行的条件;初始值++){执行的代码......
  • js代码知识的启程
           今日,我们踏上征服js代码知识的旅途当中。日后,我们必当手持键盘和鼠标,运用我等在此学到的知识来利于高山之巅。     首先,我们要了解js是什么?js可以干什么?为啥要使用js技术?在计算机当中js可以在啥位置,它的输入方式共分为几种?js代码的语法要注意啥,......
  • JS区分数组和对象的方法
    1.使用Array.isArray()方法:Array.isArray()是一个静态方法,它接受一个参数,如果参数是一个数组,则返回true,否则返回false。这是区分数组和对象的最直接和最准确的方法。constarray=[];constobject={};console.log(Array.isArray(array));//输出:trueconsole.log(Ar......