数组map一定不影响原数组?

相信很多人都有用过数组的map方法,都知道map在不影响原数组的情况下,会返回一个新数组。但是当map的数组是非基础类型数据时,是否还能不影响原数组?

  • 答案:No,非基础数据类型则会影响到原数组

例子:

  • 数组数据是基础类型数据时: [1,2,3]
let c = [1,2,3]

let d = c.map((item)=>{
    item = 1
    return item
})

// 结果 d = [1,1,1]

此时 对比一下两个数组

c.every((item,indx)=>{
    return item === d[indx]
})

得到 false
说明两个数组内容不同,map未修改原数组且返回一个新数组
  • 数组数据是非基础类型数据时: [{‘events’:[1,2]},{‘events’:[3,4]}]
let a1 = [{'texts':[1,2]},{'textts':[3,4]}]

// 此处自欺欺人一下,利用concat方法返回一个新数组给c1
let c1 = a1.concat();


c1.map((item,indx)=>{
    item.texts = item.texts.map((text,evindx)=>{
        text = 6
        console.log(texts,'kkk')
        return text
    })
    return item 
})

此时你打印c1,a1
你会发现,a1的值也被改了 
结果:[{'texts':[6,6]},{'textts':[6,6]}]

此时我们比对两个数组就变得复杂了,推荐Lodash或Underscore比较数组和对象
_.isEqual(array1, array2)   
_.isEqual(object1, object2) 
//相等则返回true,否则返回false

结论:map如何遍历的数组结构是非基础类型时,会修改到原数组数据

这是由于基础类型是栈内存存name value ,而引用类型的栈内存中的value存放的是其数据的堆内存地址,而其数据则存放在堆内存中,深浅拷贝对基础数组和引用数据类型的理解

我们对于引用类型的赋值若未深拷贝则是会直接修改到原数据,所以,如何处理这个问题呢?

很简单,提前深拷贝需要处理的数组,这样就不会直接修改到原数组

  • 题外话:为什么我们上面使用.concat() 还是没有效果呢,其实这和你使用…扩展运算符一样道理,他们都只是深拷贝了数组的第一层数据,再深层的结构是无法深拷贝到的

深拷贝推荐

  1. lodash等三方的方法,lodash.cloneDeep(objects)
  2. 循环遍历拷贝:详细可查看深浅拷贝方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一缕微风_Acker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值