Как происходит имитация с вложенными массивами в объектах

1
let obj = {key : 'Add',arr : [0,2,3]}

let obj2 = Object.assign({},obj,{arr :obj.arr})
obj2.arr.pop()
console.log(obj)
console.log(obj2)

рассмотрим вышеприведенный пример, поэтому мне нужно удалить элемент из массива obj2, тогда использование pop влияет на оба массива.

  • 0
    Так в чем же вопрос? Почему pop влияет на оба массива?
Теги:

3 ответа

0

вы должны всегда parse и stringify объект перед созданием копии,

JSON.parse(JSON.stringify(obj.arr))

Объект всегда сохраняет ссылку, поэтому, если дочерний или родительский объект изменен, оба становятся затронутыми.

то есть если object a = object b, то изменение object b влияет на object a.

let obj = {key : 'Add',arr : [0,2,3]}

let obj2 = Object.assign({},obj,{arr :JSON.parse(JSON.stringify(obj.arr))})
obj2.arr.pop()
console.log(obj)
console.log(obj2)
  • 0
    you should always parse and stringify object before making a copy, нет, вы не всегда должны это делать. Вы можете сделать это, если вы хотите изменить объект, а также если объект в основном содержит примитивы помимо функций и символов. В противном случае {name: "bob", speak: () => console.log(this.name)} уничтожит некоторые ваши данные. Если ваш объект имеет не стандартный и ненулевой прототип, вы также потеряете его.
0

Это потому, что вы прямо ссылаетесь на "arr" obj, который не является копией, а ссылкой на массив. Чтобы сделать его копией, просто измените obj2, как показано ниже, и он будет отлично работать для вашего случая pop()

let obj2 = Object.assign({}, obj, { arr : [...obj.arr] })
0

Object.assign выполняет только мелкую копию, вложенные объекты будут скопированы по ссылке.

Вы можете стягивать и затем анализировать объект, чтобы сделать глубокий клон, но будьте осторожны, потому что если ваш объект содержит функции или круговые ссылки, они будут потеряны во время сериализации.

let obj = {key : 'Add',arr : [0,2,3]}

let obj2 = Object.assign({},obj,JSON.parse(JSON.stringify({arr :obj.arr})))
obj2.arr.pop()
console.log(obj)
console.log(obj2)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню