map方法里面使用delete,为什么会改变原数组

使用map是返回一个新的数组的,我写了以下代码,发现虽然达到了我要删除数组的对象里面的指定元素了。但这个直接改变了我原数组。这让我不解,希望小伙伴能解答一下我这个菜狗的疑惑……

var arr = [{id:1,name:'coco'},{id:2,name:'gogo'}]
var brr = arr.map(v=>{
    delete v.id
    return v
})
console.log(arr,brr)

得出结果:
image.png

后来改了一下写法,不会改变原数组了。但还是有点疑惑为什么上面的写法会把原数组改变了。

var arr = [{id:1,name:'coco'},{id:2,name:'gogo'}]
var brr = arr.map(v=>{
    var obj = {
      ...v
    }
    delete obj.id
    return obj
})
console.log(arr,brr)

image.png

上面的操作其实我的目的就是想快速去除数组的对象里面某个元素。自从发现delete不安全之后,我就用比较笨的方法去实现了↓。各位有没有其他更好的方案可以提供一下,以达到快速去除数组的对象里面某个元素呢?

var arr = [{id:1,name:'coco',age:20},{id:2,name:'gogo',age:18}]
var brr = arr.map(v=>{
    return {
      name:v.name,
      age:v.age
    }
})
console.log(arr,brr)

image.png

阅读 3.6k
3 个回答

对象是引用类型,你map里面没有切断引用直接delete,因为指向的还是同一个地址,肯定会影响源数据。

es6中去掉递归对象某个属性还是比较容易的
var brr = arr.map(({id, ...v}) => v);

你得看map的实现,他的循环是使用next(index+1,data[index+1]),所以当你使用delete时循环会跳过一次,然后return的就少了一次

arr 里面的是对象 引用类型呀

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题