map和forEach易错点总结 超详细

在数据处理过程中,总是把forEach和map弄混,不清楚什么时候回改变原数据,特此记录
大佬文章

map 和forEach 的区别

map

有映射的意思,所以会返回新数组,需要有return

forEach

单纯的循环,没有返回值,不会生成新数组

什么时候会修改原数据

数组中的元素是值类型

这种情况下,map和forEach一般不会修改原数组

  • forEach
let arr2 = [1, 2, 3];
arr2.forEach((item) => {
  item = item + 100;
});
console.log("arr2", arr2);

在这里插入图片描述

  • map
let arr2 = [1, 2, 3];
let arr3 = [];
arr3 = arr2.map((item) => {
  return (item = item + 100);
});
console.log("map_____arr2", arr2);
console.log("map_____新的arr3!!!", arr3);

可以看到 原来的数组arr2没有改变,但是返回的数组arr3改变了,
在这里插入图片描述
所以,你想用map修改原来的数组也很简单,就用原来的数组承接返回数组就好了

let arr2 = [1, 2, 3];
// 用原来的数组承接
arr2 = arr2.map((item) => {
  return (item = item + 100);
});
console.log("map_____用原来的数组承接arr2", arr2);

在这里插入图片描述


数组中的元素是引用类型

  • forEach
let arr1 = [
  { name: "鸣人", age: 16 },
  { name: "佐助", age: 17 },
];
arr1.forEach((item) => {
  item.age = item.age + 1000;
});
console.log("arr1", arr1);

原数组修改成功!!!!!
在这里插入图片描述

咱就对比一下,和上面的值类型代码👇 没有区别
在这里插入图片描述


  • map
let arr1 = [
 { name: "鸣人", age: 16 },
 { name: "佐助", age: 17 },
];

let arr3 = [];
arr3 = arr1.map((item) => {
 return (item.age = item.age + 1000);
});
console.log("map_____arr1", arr1);
console.log("map_____新的arr3!!!", arr3);

原数组修改成功!!!
在这里插入图片描述


解释:

是函数形参和实参的关系。当函数的实参是引用类型,对形参的更改也会影响实参。当函数的实参是值类型,对形参的更改不会影响实参。


所以,可以粗暴的得出结论:
当数组中元素是值类型,forEach和map不会改变原数组;当是引用类型,则可以改变原数组



修改原数组的方法

  • forEach
    如果你想要修改数组 arr2 中的元素,你可以使用 forEach 的第二个参数来获取元素的索引,然后通过索引来修改数组元素的值。下面是一个例子:
let arr2 = [1, 2, 3];
arr2.forEach((item, index) => {
  arr2[index] = item + 100;
});

console.log("forEach非要修改————arr2", arr2);

在这里插入图片描述
或者用3个参数,但不如上面的方便哈

let arr2 = [1, 2, 3];
arr2.forEach((item, index, array) => {
  array[index] = item + 100; // 直接使用索引修改原数组
});
console.log("forEach_____arr2", arr2);

在这个修改后的版本中,通过使用索引直接访问并修改数组 arr2,原数组中的元素会被更新。

在JavaScript数组的forEach方法里,你可以传递一个回调函数,这个函数可以接受最多三个参数:

  1. item: 当前正在处理的数组元素的值。
  2. index: 当前正在处理的数组元素的索引。
  3. array: 正在被遍历的数组本身(即forEach调用所在的数组对象)。
    在这里插入图片描述
    使用forEach循环直接操作和修改数组的元素不是一种常见做法,因为有其他更具表现力的函数式方法可以生成新的数组而不改变原数组,如map方法。但是,如果你的目标是对现有数组进行就地修改,forEach可以胜任这个工作。

  • map
    上面提到过的,用原来的数组承接
let arr2 = [1, 2, 3];
// 用原来的数组承接
arr2 = arr2.map((item) => {
 return (item = item + 100);
});
console.log("map_____用原来的数组承接arr2", arr2);

在这里插入图片描述

当然用第二个参数也可以修改原数组:

    let arr2 = [1, 2, 3];
    arr2.map((item, index) => {
      arr2[index] = item + 100;
    });

    console.log("forEach非要修改————arr2", arr2); // [101, 102, 103]

3个参数的方法:

let arr2 = [1, 2, 3];

let arr4 = arr2.map((item, index, array)=> {
  array[index] = item + 100; // 这里直接修改了原始数组的元素
  return item + 100; // 返回新值,构成一个新的数组
});
console.log('arr2原来的数据',arr2); // 输出 [101, 102, 103],原始数组被修改了
console.log('新数组arr4____',arr4); // 输出 [101, 102, 103],这是新的数组

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值