JS 遍历

article/2025/9/28 13:51:16

目录

    • 1. for
  • 数组遍历
    • 2. for ... of
    • 3. forEach( )
    • 4. some( )
    • 5. every( )
    • 6. filter( )
    • 7. map( )
    • 8. find( )
    • 9. findIndex( )
    • 10. reduce( )
    • 11. reduceRight( )
  • 对象遍历
    • 1. for ... in
    • 2. Object.keys( )
    • 3. Object.values( )
    • 4. Object.entries( )
    • 5. Object.getOwnPropertyNames( )

1. for

for 循环可以自定义循环次数;

let arr = [1, 3, 5, 7];
for (var i= 0; i <arr.length;i++) {console.log(i,arr[i]); 
}

数组遍历

2. for … of

for ... of 可以迭代循环 可迭代对象如:Array,Map,Set,String,TypedArray,arguments 对象等等)
注:对象不可使用 for ... in 迭代循环;

let arr =[1,3,5,7];
for (let key of arr) {console.log(key); // 数组下标
}

以下几个循环都接收一个回调函数,该回调函数可接收三个参数 callback( item[,index[,selfarr] )

  • item:回调函数正在处理的数组元素;
  • index(可选):正在处理的元素在数组中所处的下标;
  • selfarr (可选):调用 map 方法的数组本身;

3. forEach( )

arr.forEach( callback( item[,index[,selfarr] ) )

forEach 遍历:每循环一次数组中的元素,就调用一次 callback 回调函数。

返回值:undefined;

提示:1.forEach 不能通过 return、break、contain 跳出循环;

底层实现:

// forEach 底层实现
function forEach(callback){for(var i=0;i<arr.length;i++){callback(arr[i],i,arr)}
}
// forEach 使用
let arr = [1,3,5,7];
arr.forEach( item => {console.log(item);
}

4. some( )

let newarr = arr.some( callback( item[,index[,selfarr] ) )

返回值:布尔值 ture / false;

some 方法会对数组中的每一项都进行遍历,找到第一个满足条件的元素就终止循环,返回 true ,如果数组中没有满足条件的元素,返回 false;

注:some 方法不会改变原数组

底层实现:

//some 底层实现
function some(callback){var flag = false;for(var i=0;i<arr.length;i++){if(callback(arr[i],i,arr)){flag = true;break;}}return flag;
}
// some 使用
let arr = [1,3,5,7];
let some = arr.some(item => {return item > 3;
)
console.log(arr); // arr = [1,3,5,7]
console.log(some); // true 数组每一项与3对比,结果依次为 false true true true some 方法只要有以一项为 true 就返回 true

5. every( )

let newarr = arr.every( callback( item[,index[,selfarr] ) )

返回值:布尔值 ture / false;

every 方法会对数组中的每一项都进行遍历,需要每一项条件都成立才返回 true,否则只要有一项不成立就返回 false。

注:every 方法不会改变原数组

底层实现:

// every 底层实现
function every(callback){var flag = true;for(var i=0;i<arr.length;i++){if(!callback(arr[i],i,arr)){flag = false;break;}}return flag;
}
let arr = [1,3,5,7];
let every = arr.every(item => {return item > 0;
})
console.log(arr); // arr = [1,3,5,7];
console.log(every); // true;

6. filter( )

let newarr = arr.filter( callback( item[,index[,selfarr] ) )

filter 方法会处理数组中的每一个元素,并将处理结果为 true (或满足条件的元素)的元素过滤出来进行返回,这些元素会组成一个新的数组。filter 遍历适合于筛选元素。

返回值:callback 返回为 true 的元素组成一个新的数组;如果没有元素返回结果为 true,返回空数组;

注:filter 方法不会改变原数组

底层实现:

//filter 底层实现
function filter(callback){var res = [];for(var i=0;i<arr.length;i++){if(callback(arr[i],i,arr)){res.push(arr[i])}}return res;
}
//filter 用法
let arr = [1,3,5,7];let filter = arr.filter(item => {return item > 4;
})
console.log(arr); // arr = [1,3,5,7]
console.log(filter); //arr = [5,7]

7. map( )

let newarr = arr.map( callback( item[,index[,selfarr] ) )

map 方法会处理数组中的每一个元素,并将每个元素的处理结果通过 return 返回出去,这些结果会组成一个新的数组。

返回值:回调函数 callback 将每次 return 的结果(结果可以为 undefined 或 null)组成一个新的数组;

注:1. map 遍历会遍历数组中每一项,不会跳出循环;
2. map 方法不影响原数组元素;
3. 新数组的长度同原数组长度一样;

注:map 方法不会改变原数组

底层实现:

// map 底层实现
function map(callback){var res = [];for(var i=0; i<arr.length; i++){ // arr 待遍历的数组res.push(callback(arr[i],i,arr))}return res;
}
// map 使用
let arr = [1,3,5,7]; let map = arr.map(item => {return item *2;
})let map1 = arr.map(item => {return item > 3;
})
console.log(arr); // arr = [1,3,5,7]
console.log(map); // map = [2,6,10,14];
console.log(map1); // map1 = [false,false,true,true]

8. find( )

let item = arr.find( callback( item[,index[,selfarr] ) )

返回值:返回第一个符合条件的数组成员,没有符合条件则返回 undefined

注:find 方法不会改变原数组

9. findIndex( )

let index = arr.findIndex( callback( item[,index[,selfarr] ) )

返回值:返回符合条件的数组成员的下标,没有符合条件则返回 -1

注:findIndex 方法不会改变原数组

// find、findIndex 用法:
let arr = [1,3,5,7];// find() 
let item = arr.find(function(val,index,arr) {console.log(val,index,arr); // 1,0,[1,3,5,7]return val > 4; // 返回 5,虽然 5 7 都符合大于 4 的条件,但是只返回找到符合条件的第一个,即元素 5
})
console.log(item); // 返回 5,虽然 5 7 都符合大于 4 的条件,但是只返回找到符合条件的第一个,即元素 5// findIndex( )
let ind = arr.findIndex(val => val >5);
console.log(ind); // 3,大于 5 的值的数组元素仅有 7,7 所在的下标为 3

10. reduce( )

arr.reduce( callback(preval, item, index, arr), val)
callback:回调函数,该回调函数中可以传递以下几个参数:

  • preval:初始值 或 上次循环中的返回值;
  • item:当前数组元素;
  • index:当前数组元素的下标;
  • arr:当前数组元素所在的数组对象;
  • val:传递给回调函数的初始值;

注:reduce 遍历可以记录上次循环中处理结果;

// reduce 底层实现
function reduce(fn){if(arr.length==1) return arr[0]var res = arr[0];for(var i=1;i<arr.length;i++){res = fn(res,arr[i],i,arr);}return res;
}
// reduce 用法
let arr = [1,3,5,7];
let reduce = arr.reduce((preval,item) => {console.log(preval,item);return preval+item;
},0)
console.log(arr); // arr = [1,3,5,7]
console.log(reduce); // reduce = 16

在这里插入图片描述

11. reduceRight( )

arr.reduce( callback(preval, item, index, arr), val)
和 reduce() 方法类似,不同的是,reduceRight() 方法中数组元素是从右到左计算,可将其看作原数组先逆序排列再进行 reduce 方法的结合

let map = arr.reduce((preval, item) => {console.log(`pre: ${preval}, item: ${item}`);return preval + item;
}, 0)
console.log('map:',map);let map1 = arr.reduceRight((preval, item) => {console.log(`pre: ${preval}, item: ${item}`);return preval + item;
}, 0)
console.log('map1:',map1);

在这里插入图片描述

对象遍历

1. for … in

for ... in 可以用来遍历对象,获取键名遍历数组,获取数组元素下标(数组元素下标相对于对象键名)

for ... in 可以通过 continue 、break 和 return 中断遍历,不同的是 return 需要放在函数体中进行中断

// for ... in
let stu = {name:'andy',age:10,sex:'female'
}for(let key in stu){console.log(key,stu[key]); // name 'andy' 每次遍历,都会将键名赋值给 key      
}

2. Object.keys( )

ES6 新特性,参数:被返回其枚举自身属性的对象;
返回值:可枚举属性组成的数组

注:当参数不是对象,Object.keys() 方法会将参数转为对象类型,索引充当键名,返回由键名组成的数组。

参数有以下几种情况:

  1. 对象,Object.keys() 方法获取对象的键名,返回一个由键名(键名为字符串类型)组成的数组;
  2. 数组,Object.keys() 方法获取数组元素索引,返回一个由索引值(索引值为字符串类型)组成的数组;
  3. 字符串,Object.keys() 方法获取字符串的索引,返回一个由索引值(索引值为字符串类型)组成的数组;

    在这里插入图片描述

3. Object.values( )

ES6 新特性,参数:被返回可枚举属性值的对象;
返回值:包含对象自身的所有可枚举属性值的数组;

注:如果参数不是对象,Object.values() 会将参数先转为对象,返回由属性值组成的数组。

参数有以下几种情况:

  1. 对象,Object.values() 方法获取对象的属性值,返回一个由属性值组成的数组;
  2. 字符串,Object.values() 方法获取字符串的单个字符,返回一个由字符组成的数组;

在这里插入图片描述

// 对象
let stu = {name:'andy',age:20,sex:'female'
}
let keysArr= Object.keys(stu);
console.log(keysArr); // [ "name", "age", "sex" ]let valArr = Object.values(stu);
console.log(valArr); // [ "andy", 10, "female" ]// 数组
let arr = ['apple','orange','banana'];
let keysArr= Object.keys(arr);
console.log(keysArr); // [ "0", "1", "2" ]let valArr = Object.values(arr);
console.log(valArr); // [ "apple", "orange", "banana" ]// 字符串
let str = 'ysjx';
let keysArr= Object.keys(str);
console.log(keysArr); // [ "0", "1", "2","3" ]
let valArr = Object.values(stu);
console.log(valArr); // [ "y", "d", "j","x" ]

4. Object.entries( )

参数:可以返回其可枚举属性的键值对的对象;
返回值:给定对象自身可枚举属性的键值对数组;(返回多个数组,一个数组由可枚举对象的一个属性及其对应的属性值组成,如:[属性,属性值]

参数有以下几种情况:

  1. 对象;
  2. 数组;
  3. 字符串
    在这里插入图片描述

5. Object.getOwnPropertyNames( )

获取对象的所有属性(和 Object.keys() 类似),但 Object.getOwnPropertyNames() 还可以获取不可枚举的属性
在这里插入图片描述

参考博客:1. JS 遍历底层实现


http://chatgpt.dhexx.cn/article/1M7DqjZE.shtml

相关文章

数据库——数据字典

数据库——数据字典是什么&#xff1f; 一.数据字典以及使用场景&#xff1a; User表&#xff0c;User主体有很多属性&#xff0c;比如证件&#xff08;身份证、居住证、港澳通行证…&#xff09;地区&#xff08;河北、河南、北京…&#xff09;等&#xff0c;然后表建好了&…

数据库设计--数据字典

数据字典定义 数据字典&#xff08;data dictionary&#xff09;是对于数据模型中的数据对象或者项目的描述的集合&#xff0c;这样做有利于程序员和其他需要参考的人。分析一个用户交换的对象系统的第一步就是去辨别每一个对象&#xff0c;以及它与其他对象之间的关系。这个过…

解决Error: ENOENT: no such file or directory, scandir ‘xxx\node-sass\vendor‘

解决Error: ENOENT: no such file or directory, scandir xxx\node-sass\vendor 前端项目持续部署打包中出现一个奇怪的问题&#xff0c;记录一下。 cnpm install 安装依赖成功 cnpm run build 构建时失败了&#xff0c;错误表示没有 D:\andex\stofrontend\node_modules\node…

Syntax Error: Error: ENOENT: no such file or directory, scandir ‘D:

在使用npm安装node-sass的时候&#xff0c;可能会出现如下的报错&#xff1a; Syntax Error: Error: ENOENT: no such file or directory, scandir D:\work\ 解决方案是执行以下方法&#xff1a; npm rebuild node-sass

扫描dir目录函数之scandir()

scandir: 读取特定的目录数据头文件: dirent.h 函数定义: int scandir(const char *dir, struct dirent ***namelist, int (*select)(const struct dirent *), int (*compar)(const struct dirent**, const struct dirent**)); 说明: scandir()会扫描参数dir指定的目录文件, …

解决Error: ENOENT: no such file or directory, scandir

解决Error: ENOENT: no such file or directory, scandir xxx\node-sass\vendor 前端项目持续部署打包中出现一个奇怪的问题&#xff0c;记录一下。 cnpm install 安装依赖成功 npm run build 构建时失败了&#xff0c;错误表示没有 D:\andex\stofrontend\node_modules\nod…

Module build failed: Error: ENOENT: no such file or directory, scandir node_modules\node-sass\vendor

npm install 报错 Module build failed: Error: ENOENT: no such file or directory, scandir D:\workspaces\xxx\node_modules\node-sass\vendor npm install node-sass 或者 npm rebuild node-sass 即可 下载完成后项目成功启动。

解决Vue Disconnected from UI server errno: -4058, syscall: ‘scandir‘, code: ‘ENOENT‘,

启动vue ui时出现上述报错 查看powershell中的错误提示 发现问题出在扫描项目时项目中少了某个文件夹 解决方法&#xff1a;手动创建该文件 问题解决

npm安装electron时报Error: EPERM: operation not permitted, scandir.....

刚弄完vue脚手架,准备安装electron写个桌面应用&#xff0c;运行命令vue add electron-builder一直报错 Error: EPERM: operation not permitted, scandir C:\Users\ &#xff0c;百度解释说因为没有权限操作&#xff0c;于是百度试各种方法&#xff0c; 打开黑窗口一遍遍尝试&…

解决“: no such file or directory, scandir ‘..\node_modules\node-sass\vendor“

一、报错信息 二、出现原因 在下载包完成启动项目时出现 Error: ENOENT: no such file or directory, scandir ‘D:…\signpay-admin-new\node_modules\node-sass\vendor’ 三、解决办法 重新下载node-sass包即可 npm rebuild node-sass

解决 no such file or directory, scandir ‘node_modules\node-sass\vendor 报错

运行项目突然报错【no such file or directory, scandir node_modules\node-sass\vendor】这个错误 报错说是找不到node-sass文件路径&#xff0c;最后找到了解决方案 错误截图如下&#xff1a; 重新构建一下npm rebuild node-sass包 npm rebuild node-sass 再直接运行&…

C语言测试。自己实现scandir 函数

在C语言课程的后端&#xff0c;讲完指针和标准文件IO处理&#xff0c;我会做出一个难度较大练习&#xff0c;题目就是&#xff0c; 利用标准的目录处理函数 opendir/readdir/closedir实现类似于 scandir的功能。其中接口要scandir 函数一致。 这个题目看起来简单&#xff0c;实…

5G物联网设备,防止黑客入侵是首要问题

5G IoT设备预计2023年将达到4900万台&#xff0c;研究人员启动了一些程序来防止IoT成为渗透的黑洞。开放标准被认为可以推动物联网设备的互操作性&#xff0c;从而使网络安全软件可以在整个网络中查询设备。许多供应商甚至希望在物联网节点中安装应用程序或代理。毕竟所有移动设…

5G技术在物联网行业的应用

2015年6月&#xff0c;国际电信联盟无线通信部门&#xff08;ITU-R&#xff09;5G 工作组第 22 次会议召开&#xff0c;正式将 5G 命名为 IMT-2020。 什么是5G 5G网络即第五代移动通信网络&#xff0c;数据传输速率远高于以前的蜂窝网络&#xff0c;最高可达10 Gbit/s&#xff…

当5G物联网“遇上”供水?供水行业智慧化更进一步!

伴随着5G、物联网等技术的发展&#xff0c;智慧水务产品数字化和智能化程度正在以前所未有的速度提升。在众多水务应用场景中&#xff0c;二次供水因其居民用水“最后一公里”的特殊性&#xff0c;成为水务智慧化的首选方向。 近期&#xff0c;天翼物联携手水务行业龙头企业上海…

5G 及其对物联网的影响

文章转载自网络通信频道 毫不奇怪&#xff0c;数字世界正在通过先进的解决方案逐渐扩展其功能。物联网不再是一项新技术&#xff0c;而是从制造业到教育等不同行业数字化转型战略的共同组成部分。 5G 连接目前使其在技术世界中的存在更加稳定。根据 2022 年 GSMA 的移动经济报告…

MQTT网关 5G物联网网关 PLC控制工业网关

MQTT网关&#xff0c;两个以上的节点之间通信的新型网关&#xff0c;网络节点之间通过互连来实现双向通信。支持PLC协议转MQTT&#xff0c;实现plc数据采集上云&#xff0c;物联网云平台对接&#xff0c;广泛应用于工业自动化plc远程监测控制。 计讯物联5G MQTT物联网网关TG463…

智慧工厂自动化智能制造对5G物联网技术应用的功能与优势

5G物联网网关应用下的5G智慧工厂自动化智能制造&#xff0c;依托物联网、感知、 无线、大数据云计算等高新技术&#xff0c;连接工厂各节点设备网络&#xff0c;建立数据涌道&#xff0c;实现采集现场生产信息远程在线实时监控&#xff0c;生产过程的全方位可视化和现场生产设备…

【通信】基于粒子群实现5G物联网云网络优化附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

计讯物联5G物联网智能网关助力充电桩运维管理更加高效

随着中国“碳达峰、碳中和”发展目标的提出&#xff0c;新能源汽车渗透率的不断提升&#xff0c;充电桩基础设施建设也随之全面提速。计讯物联聚焦国家政策热点&#xff0c;洞悉行业最新风向&#xff0c;将充电桩、智能电网与物联网技术有机融合&#xff0c;自主研发5G物联网智…