Js中forEach map无法跳出循环问题以及forEach会不会修改原数组

for循环里要跳出整个循环是使用break,但在数组中用forEach循环或者map如要退出整个循环使用break会报错,使用return也不能跳出循环,

一.JavaScript中 forEach map 方法 无法跳出循环问题及解决方案

1.forEach map 使用break报错

	let arr = [1, 2, 3, 4, 5];
     arr.map((item, index) => {    // forEach一样的
         if (item === 3) {
             break;
         }
         console.log(item);
     });

在这里插入图片描述

2.forEach map 使用return不退出循环

 let arr = [1, 2, 3, 4, 5];
  arr.map((item, index) => {     // forEach一样的
      if (item === 3) {
          return;
      }
      console.log(item);
  });

在这里插入图片描述
如何解决跳出循环:

3.方法一:使用 for 循环

const arr1 = [1, 2, 3, 4, 5];
const count = 3;
  function test() {
      for (let i = 0; i < arr.length; i++) {
          if (arr[i] == count) {
              return arr[i]
          }
      }
  }
  console.log(test())  // 3

在这里插入图片描述

4.方法二: some () 当内部 return true 时跳出整个循环

	const arr2 = [1, 2, 3, 4, 5];
	const b = 3;
	 arr2.some((item) => {
	     if (item == b) {
	         return item;     // 返回值为true,并跳出循环
	     }
	     console.log(item);
 })

在这里插入图片描述

5.方法三:every() 当内部 return false 时跳出整个循环(需要写 return true )

const arr3 = [1, 2, 3, 4, 5];
const c = 3;

 arr3.every((item) => {
     if (item == c) {
         return false;
     } else {
         console.log(item);
         return true;
     }
 })

在这里插入图片描述

二.关于forEach会不会改变原数组问题

面试官:JavaScript中使用forEach会改变原来的数组吗?
答:如果数组中的值是基本类型, 改变不了;如果是引用类型分两种情况:1、没有修改形参元素的地址值, 只是修改形参元素内部的某些属性,会改变原数组;2、直接修改整个元素对象时,无法改变原数组;

2.1、数组的元素是基本数据类型:(无法改变原数组)

修改基础数据类型 String Number Boolean Undefined Null,那就不会改变

let numArr = [1, 2, 3];
 
numArr.forEach((item) => {
    item = item * 2;
});
console.log(numArr); // 打印结果:[1, 2, 3] , 不是 [2, 4, 6]

2.2、数组的元素是引用数据类型:(直接修改整个元素对象时,无法改变原数组)

let objArr = [
    { name: '张三', age: 20 },
    { name: '李四', age: 30 },
];
 
objArr.forEach((item) => {
    item = {
        name: '王五',
        age: '29',
    };
});
console.log(JSON.stringify(objArr)); 
 
// 打印结果:[{"name": "张三","age": 20},{"name": "李四","age": 30}]

2.3、数组的元素是引用数据类型:(修改元素对象里的某个属性时,可以改变原数组))

let objArr = [
    { name: '张三', age: 28 },
    { name: '李四', age: 30 },
];
 
objArr.forEach((item) => {
    item.name = '王五';
});
console.log(JSON.stringify(objArr));
// 打印结果:[{"name":"王五","age":28},{"name":"王五","age":30}]

2.4. 如何改变原数组中基本类型的值:

可以借助第二个参数index来改变数组

let array = [1, 2, 3, 4];
array.forEach((item,index) => {
	array[index] = item * 2
})
console.log(array); // [2, 4, 6, 8]

如果纯粹只是遍历数组,那么,可以用 forEach() 方法

但是,如果你想在遍历数组的同时,去改变数组里的元素内容,那么,最好是用 map() 方法来做,不要用 forEach()方法,避免出现一些低级错误。

3.1. map返回改变后的对象:

 let arr = [{ key1: '111' }, { key1: '222' }]
 let newArr = arr.map((item) => {
     item.key2 = 'ceshi';
     return item;
 })
 console.log(arr);
 // [{key1: "111", key2: "ceshi"},{key1: "222", key2: "ceshi"}]
 console.log(newArr);
 // [{key1: "111", key2: "ceshi"},{key1: "222", key2: "ceshi"}]

如何避免这种问题呢?
通过一个新的对象去接收每一个元素,修改后,返回该对象

let arr = [{ key1: '111' }, { key1: '222' }]
let newArr = arr.map((item) => {
     let obj = { ...item, key2: 'kebi' }
     return obj;
 })
 console.log(arr);//原数组不变化
 // [{ key1: '111' }, { key1: '222' }]
 console.log(newArr); //返回的新数组发生变化
 // [{ key1: '111' ,key2: "kebi"}, { key1: '222' ,key2: "kebi"}]

参考:https://blog.csdn.net/Teemo_shape/article/details/124290093
https://blog.csdn.net/zhangwenok/article/details/124692883
https://blog.csdn.net/Jenn168/article/details/105006701

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值