JS数组遍历的几种方法

不念不忘少年蓝@ 2021-09-19 03:02 569阅读 0赞

for

    最简单的一种循环遍历方法,也是使用频率最高的一种,可优化
    循环过程中支持修改索引(修改 i)

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

    优化:使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显

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

for…in…

    这个循环用的人也很多,但是效率最低(输出的 key 是数组索引),如果遍历的是对象,输出的则是对象的属性名

  1. var arr = ['我', '是', '谁', '我', '在', '哪']
  2. for(let key in arr) {
  3. console.log(key)
  4. }
  5. // 0 1 2 3 4 5
  6. let obj = {
  7. a: 11,
  8. b: 22,
  9. c: 33
  10. }
  11. for(let key in obj) {
  12. console.log(key)
  13. }
  14. // a b c

for…of…(ES6)

    虽然性能要好于 for..in...,但仍然比不上普通的 for 循环
    注意:不能循环对象,因为任何数据结构只要部署 Iterator接口,就可以完成遍历操作,有些数据结构原生具备 Iterator 接口,比如ArrayMapSetString等,而 Iterator 接口是部署在数据结构的Symbol.iterator属性上的,而对象Object恰恰是没有Symbol.iterator属性的,所以无法被for..of遍历

  1. var arr = ['我', '是', '谁', '我', '在', '哪']
  2. for(var key of arr) {
  3. console.log(key)
  4. }
  5. // 我 是 谁 我 在 哪

forEach(也叫作增强for循环)

    1. 数组里的元素个数有几个,该方法里的回调就会执行几次
    2. 第一个参数是数组里的元素,第二个参数为数组里元素的索引,第三个参数则是它自己(利用第三个参数可以进行数组去重)
    3. 数组自带的遍历方法,foreach在循环次数未知或者计算起来较复杂的情况下效率比for循环高
    4. 循环的数组元素是基本数据类型,不会改变原数据的数据,循环的数组元素为对象,会改变原数组的对象属性的值
    5. 循环过程中不支持修改索引,回调中使用return不会报错,但是无效
    注意:不能使用breakcontinue跳出整个循环或当前循环的,会报错,但是结合try...catch可以实现跳出循环

  1. var arr = [1, 2, 3, 4, 5, 6]
  2. arr.forEach((item, idnex, array) => {
  3. console.log(item) // 1 2 3 4 5 6
  4. console.log(array) // [1, 2, 3, 4, 5, 6]
  5. })
  6. // 循环的数组元素是基本数据类型,不会改变原数据的数据
  7. var arr1 = [1, 2, 3, 4, 5, 6]
  8. arr1.forEach((item) => {
  9. item = 10
  10. })
  11. console.log(arr1) // [1, 2, 3, 4, 5, 6]
  12. // 循环的数组元素为对象,会改变原数组的对象属性的值
  13. var arr2 = [
  14. { a:1, b:2 },
  15. { a:11, b:12 }
  16. ]
  17. arr2.forEach((item) => {
  18. item.a = 10
  19. })
  20. console.log(arr2) // [{a: 10, b: 2}, {a: 10, b: 2}]
  21. // 使用try...catch...可以跳出循环
  22. try {
  23. let arr = [1, 2, 3, 4];
  24. arr.forEach((item) => {
  25. // 跳出条件
  26. if (item === 3) {
  27. throw new Error("LoopTerminates");
  28. }
  29. console.log(item);
  30. });
  31. } catch (e) {
  32. if (e.message !== "LoopTerminates") throw e;
  33. };
  34. // 1 2

map(ES6)

    遍历每一个元素并且返回对应的元素(可以返回处理后的元素) (map 映射 一一 对应)
    返回创建的新数组和原来旧数组的长度是一样的,使用比较广泛,但其性能还不如 forEach
    前两种写法都会改变原数组,第三中方式则不会改变原数组
    注意:不能使用breakcontinue跳出整个循环或当前循环的,会报错,但是结合try...catch可以实现跳出循环

  1. // 一、会改变原数组
  2. var arr = [1, 2, 3, 4, 5, 6]
  3. var newArr = arr.map(function (item, idnex) {
  4. return item * item
  5. })
  6. console.log(arr) // [1, 2, 3, 4, 5, 6]
  7. console.log(newArr) // [1, 4, 9, 16, 25, 36]
  8. // 二、会改变原数组元素中对象的属性值
  9. var arr = [{ a: 1, b: 2},{ a: 11, b: 12}]
  10. let newARR = arr.map((item)=>{
  11. item.b = 111
  12. return item
  13. })
  14. console.log('arr数组',arr) // [{a: 1, b: 111},{a: 11, b: 111}]
  15. console.log('newARR',newARR) // [{a: 1, b: 111},{a: 11, b: 111}]
  16. // 三、不会改变原数组
  17. var arr = [{ a: 1, b: 2},{ a: 11, b: 12}]
  18. let newARR = arr.map((item)=>{
  19. return {
  20. ...item,
  21. b:111
  22. }
  23. })
  24. console.log('arr数组',arr) // [{a: 1, b: 2},{a: 11, b: 12}]
  25. console.log('newARR',newARR) // [{a: 1, b: 111},{a: 11, b: 111}]
  26. // 四、使用try...catch...可以跳出循环
  27. try {
  28. var arr = [1, 2, 3, 4];
  29. arr.map((item) => {
  30. //跳出条件
  31. if (item === 3) {
  32. throw new Error("LoopTerminates");
  33. }
  34. console.log(item);
  35. return item
  36. });
  37. } catch (e) {
  38. if (e.message !== "LoopTerminates") throw e;
  39. };
  40. // 1 2

filter(ES6)

    遍历数组,过滤出符合条件的元素并返回一个新数组

  1. var arr = [
  2. { id: 1, name: '买笔', done: true },
  3. { id: 2, name: '买笔记本', done: true },
  4. { id: 3, name: '练字', done: false }
  5. ]
  6. var newArr = arr.filter(function (item, index) {
  7. return item.done
  8. })
  9. console.log(newArr)
  10. // [{ id: 1, name: '买笔', done: true },{ id: 2, name: '买笔记本', done: true }]

some(ES6)

    遍历数组,只要有一个以上的元素满足条件就返回 true,否则返回 false

  1. var arr = [
  2. { id: 1, name: '买笔', done: true },
  3. { id: 2, name: '买笔记本', done: true },
  4. { id: 3, name: '练字', done: false }
  5. ]
  6. var bool = arr.some(function (item, index) {
  7. return item.done
  8. })
  9. console.log(bool) // true

every(ES6)

    遍历数组,每一个元素都满足条件 则返回 true,否则返回 false

  1. var arr = [
  2. { id: 1, name: '买笔', done: true },
  3. { id: 2, name: '买笔记本', done: true },
  4. { id: 3, name: '练字', done: false }
  5. ]
  6. var bool = arr.every(function (item, index) {
  7. return item.done
  8. })
  9. console.log(bool) // false

find(ES6)

    遍历数组,返回符合条件的第一个元素,如果没有符合条件的元素则返回 undefined

  1. var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
  2. var num = arr.find(function (item, index) {
  3. return item === 3
  4. })
  5. console.log(num) // 3

findIndex(ES6)

     遍历数组,返回符合条件的第一个元素的索引,如果没有符合条件的元素则返回 -1

  1. var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
  2. var num = arr.findIndex(function (item) {
  3. return item === 3
  4. })
  5. console.log(num) // 4

发表评论

表情:
评论列表 (有 0 条评论,569人围观)

还没有评论,来说两句吧...

相关阅读