不是说map不会改变原数组的吗?

image.png
再次打印出newjson的时候,里面已经被污染了

阅读 1.7k
avatarAI BotBETA

在编程中,map函数并不一定会改变原数组。这是因为在大多数编程语言中,例如Python和JavaScript,map函数是一个对数组元素进行某种操作并返回结果的函数,它不会改变原数组。

然而,根据你的描述,看起来你的代码中的map函数改变了原数组。这可能有几种原因:

  1. 你的map函数实际上在内部修改了数组。例如,在某些语言中,如果map函数中使用的操作涉及到引用或指针,那么它可能会在原地修改数组。
  2. 你可能误解了什么是“原数组”。在某些情况下,可能存在两个或更多的数组引用指向同一块内存。在这种情况下,如果你修改了一个数组,那么所有引用这个内存的数组都会被改变。
  3. 在并发环境下,如果多个线程同时访问和修改同一数组,可能会出现“污染”的情况。

为了给出更具体的答案,我需要更多关于你的代码和使用的编程语言的信息。

4 个回答

map不会改变原数组指的是

const arr = [{v: 1},{v: 2}]
const arr_new = arr.map(v => v)
arr_new.push({ v: 3 })
console.log(arr)

你都写了句item.name = 'dd',这还不改变?


给你举个简单明了的例子吧.
你把旧钱包(arr)每一张钞票(item)都换到新钱包(new_arr).
之后你再给新钱包(new_arr)塞一张钞票进去.
旧钱包不会有改变.


你贴的代码的意思是
你把旧钱包(arr)每一张钱(item)都换个新钱包(new_arr)的时候,
在每张钞票上画了一朵叫做name的小花


ps.防钻牛角尖指南,用现实的钞票举例子不太合适,毕竟现实里的同一张钞票没办法同时存在两个钱包里,理解这个问题的时候,你就当同一张钞票可以同时存在两个钱包里吧

"不改变原数组"是指的数组本身,不是说数组里的每个元素。

let arr1 = [{ id: 1 }, { id: 2 }];
let arr2 = arr1.map(e => ({ id: e.id + 1 }));

console.log(arr1); // [{ id: 1 }, { id: 2 }]
console.log(arr2); // [{ id: 2 }, { id: 3 }]

你这里每个元素都是引用类型的,这么写当然会变了,这跟 map 毫无关系。

不改变原数组指的是不改变数组内部元素的个数和顺序,而不是元素本身的属性。
可以和其他数组方法对比理解:

  1. map:不改变元素个数和顺序;
  2. filter:不改变元素顺序,可能改变元素个数;
  3. sort:不改变元素个数,可能改变元素顺序;
let maps = newjson.map((item: any) => ({ ...item, name: 'dd' }));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏