目录

总结

一、常规方法

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

js数组遍历方法总结与对比相关推荐

  1. js 数组遍历方法详解(map、filter、find、findIndex、reduce)

    目录 前言 map map是什么 map方法的结构及入参 语法糖 map一般不改变原数组 filter 说明 例子 find 和 findIndex 说明 例子 reduce 说明 例子 尾言 前言 ...

  2. js数组遍历方法总结

    1.for循环 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显. for(j = 0, j < arr.length; j++) {} 2.forEach循 ...

  3. js数组遍历方法及其区别

    1.for循环 支持break和continue const arr = [1, 2, 3, 4, 5] for (let i = 0; i < arr.length; i++) {if (ar ...

  4. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  5. JS数组遍历的几种方式

    JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...

  6. html遍历数组,JS数组遍历的几种方式

    JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代码如下: for(j = ...

  7. JS数组去重方法记录

    js数组去重方法 1.遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 代码如下(示 例): function getArray(ar) {va ...

  8. js数组遍历和对象遍历

    针对js各种遍历作一个总结分析,从类型用处:分数组遍历和对象遍历:还有性能,优缺点等. JS数组遍历: 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9];for ( v ...

  9. 转→js数组遍历 千万不要使用for...in...

    看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...

最新文章

  1. java openfile busy_android java.io.IOException: open failed: EBUSY (Device or resource busy)
  2. UVALive 7040 Color
  3. clone是深拷贝还是浅拷贝_go-clone:深拷贝 Go 数据结构
  4. 【大局观很关键】关于找程序的bug
  5. 高德推出查岗功能_新型「查岗」工具?高德推出「家人地图」新功能
  6. SAP Spartacus里所有backend endpoint list
  7. 图像语义分割 -- FCN
  8. Go map 转 slice
  9. typora 免费版, 最后一个beta版本下载
  10. java white case语句_MySQL的CASEWHEN语句使用说明_MySQL
  11. ktv点歌系统服务器的安装,最详细的KTV点歌系统安装教程
  12. 干法读后感--磨练灵魂 提升心志
  13. EXCEL的水文数据四舍六入修约
  14. 搭建简易个人博客(一篇文章就搞定!)
  15. ant-design-vue 中标签页tab上额外的元素(tabBarExtraContent) , tab选项卡头增加文字
  16. 常见的医学图像成像及存储格式解析
  17. next_day的使用
  18. 惠普136w耗材贵吗_销量第一:惠普136w和136nw区别哪个好?区别有吗?使用分享爆料...
  19. Android应用开发--MP3音乐播放器滚动歌词实现,flutter跳转动画
  20. FATE框架实战(一)

热门文章

  1. 海康视频行为分析仪接入
  2. 使用reCAPTCHA实现验证码
  3. 计算机的论文创新点怎么写,如何写论文创新点.doc
  4. 【EndNote】功能强大的文献管理软件
  5. Java实现RSA 2048加密解密
  6. 用JAVA完成1000以内素数的判断
  7. NOJ1076 机器狗组装费用 贪心
  8. PHP解压ZIP乱码问题
  9. 翻译官Rosetta 2:苹果Mac切换ARM架构的幕后功臣
  10. fm算法详解_Python实现FM算法解析