当前位置: 首页 > news >正文

js数组遍历方法总结与对比

目录

总结

一、常规方法

for的4种写法

while

二、ES6方法

for...of,得到每项元素

for...in,得到的是数组索引

三、数组实例上的遍历方法

forEach(),得到每一项元素

map()

filter(),筛选一个数组

some(),数组某项满足条件

every (),数组每项都满足条件


总结

  • 不需要保留原数组,不需要中断循环,使用forEach代替常规for
  • 需要保留原数组并使用逻辑处理后的新数组时用map
  • 遍历对象时,使用for..of+Object.keys(),尽量不使用for..in
  • 根据业务场景选择使用filter、some、every等

一、常规方法

for的4种写法

let tmp_array = [1,2,3,4,5,6,7]
// 方法一 数组长度是会动态变化,每次循环会重新计算length长度,可能会出现死循环
for (let i = 0; i < tmp_array.length; i++) {
  console.log(tmp_array[i])
}
// 方法二 缓存length 值,无需重新计算length
for (let i = 0, len = tmp_array.length; i < len; i++) {
  console.log(tmp_array[i])
}
// 方法三 倒序
for (let i = tmp_array.length-1; i >= 0; i--){
  console.log(tmp_array[i])
}
//倒序简洁版本
//两个分号之间的表达式为 true 会一直执行,直到判断为 false (i = 0)
for (let i = tmp_array.length-1; i--;){
     arr1.push(arr[i])
}
// 方法四
for (let i = 0, tmp; tmp = tmp_array[i]; i++) {
  console.log(tmp)
}

4种写法在时间和内存消耗是上无大差别,常用方法一、二。

while

时间和内存消耗与常规for无区别,数组遍历较少使用。

二、ES6方法

for...of,得到每项元素

let array = [1,2,3,4,5,6,7];
for(let ele of array) {
  console.log(ele);
};

//字符串也可以使用for...of遍历
let str = "helloabc";
for(let ele of str) {
  console.log(ele);
}

//对象不可以使用
let table = {
  a : 10,
  b : true,
  c : "jadeshu"
};

for(let item of table) {
  console.log(item); //table is not iterable
}
  • 可以遍历任何可迭代对象,如数组、字符串、Map、Set、DOM collection等,
  • 可以使用 break,continue和return 终止循环 ,
  • 内存占用少。

对象使用for...of

//通过Object.keys遍历
for (let key of Object.keys(table)) {
  console.log(key + ": " + table[key]);
}

for...in,得到的是数组索引

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

//也可以对enumerable对象操作!得到的是每项的索引key
var table = {
  a : 10,
  b : true,
  c : "jadeshu"
};
for(let index in table) {
  console.log(index, table[index]);
}

一般用于遍历对象,会将本身属性和原型链上的属性(除系统内置属性)全部遍历出来即便是不可枚举属性(enumerable:false), 可以通过 items.hasOwnProperty来遍历本身属性,由于查询到自己的原型链上,所以性能方面比较差 ,占用内存高。

三、数组实例上的遍历方法

forEach(),得到每一项元素

不会返回新的数组,常用于遍历数组,不能中断循环(使用break或return语句)。

我在工作中需要遍历对象数组并在某条件满足时改变每项值时使用,写法更优雅。

var array = [1,2,3,4,5,6,7];

array.forEach(item => {
  console.log(item);
});

map()

返回一个新数组,不能中断循环

由于有返回值,无需额外调用新数组的push方法,所以在执行浅拷贝任务上,内存占用很低

常用于需要对原数组进行逻辑处理并根据处理逻辑获取一个新数组。

let array = [1,2,3,4,5,6,7]
let copyArr = array.map(function(value){
   return value+10
})
console.log(copyArr)

filter(),筛选一个数组

返回一个新数组,不改变原数组,不对空数组检测

var arr = ['A', '', 'B', null, undefined, 'C', '  '];
var r = arr.filter(function (s) {
    return s && s.trim(); 
});
r; // ['A', 'B', 'C']

some(),数组某项满足条件

返回true/false,不改变原数组,不对空数组检测

var arr = ['', 'pear', 'orange'];
let tmp = arr.some(function (s) {
    return s.length > 0;
})
console.log(tmp); // true, 因为有个元素满足s.length>0

every (),数组每项都满足条件

返回true/false,不改变原数组,不对空数组检测

var arr = ['Apple', 'pear', 'orange'];
let tmp = arr.every(function (s) {
    return s.length > 0;
})
console.log(tmp); // true, 因为每个元素都满足s.length>0

相关文章:

  • PAT乙级 我要通过(1003)的详细解答过程
  • PAT乙级 成绩排名(1004) c++题解
  • PAT乙级 继续(3n+1)猜想(1005) c++题解(打表越界的段错误)
  • PAT乙级 素数对猜想(1007)c++实现
  • PAT乙级 说反话(1009)c++新手易懂版
  • 图的深度遍历(邻接表)SCAU c++
  • 图的广度遍历(邻接表)SCAU c++
  • 堆排序 SCAU c++
  • 归并排序(非递归)超详细解答!!
  • PAT乙级 一元多项式求导(1010)详细解答c++
  • C语言课程设计物品竞拍管理(成品版!)
  • 折半查找判定树的画法(较简单易懂!)
  • 剑指 Offer 58 - I. 翻转单词顺序c++解法
  • 2. 两数相加 -力扣c++解法
  • 7.整数反转 - 力扣(LeetCode)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 0基础学习移动端适配
  • CAP理论的例子讲解
  • JAVA 学习IO流
  • JavaScript异步流程控制的前世今生
  • php ci框架整合银盛支付
  • Rancher-k8s加速安装文档
  • 从0到1:PostCSS 插件开发最佳实践
  • 当SetTimeout遇到了字符串
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 缓存与缓冲
  • 前端存储 - localStorage
  • 微信支付JSAPI,实测!终极方案
  • 新书推荐|Windows黑客编程技术详解
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 怎么将电脑中的声音录制成WAV格式
  • 阿里云服务器如何修改远程端口?
  • 带你开发类似Pokemon Go的AR游戏
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ${factoryList }后面有空格不影响
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (实战篇)如何缓存数据
  • (一)kafka实战——kafka源码编译启动
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)Linux 多线程条件变量同步
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Core 2.1路线图
  • .net 后台导出excel ,word
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)