Как клонировать массив объектов перед удалением?

Почему в data: [] пустой массив?

И как после отправки полностью удалить копию из памяти?

let items = [
  {ws: false, data: [1,2,3,4,5]},
  {ws: false, data: [1,2,3,4,5]},
  {ws: false, data: [1,2,3,4,5]},
  {ws: false, data: [1,2,3,4,5]},
];
let clone = [...items];
for (let i in items) {
  items[i].data = [];
}

console.log(clone);

function sendData() {
  $.ajax({
    url: '/',
    method: 'POST',
    data: { data: clone },
    dataType: 'json',
    success: function(data) {},
    complete: function() {
      // удалить из памяти clone
    }
  });
}

// sendData(); // Отправка на сервер


Ответы (1 шт):

Автор решения: SwaD

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

let items = [
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
];
let clone = [...items]; // Создаем новый массив
for (let i in items) {
    clone[i] = { ...clone[i] }; // клонируем объекты
    items[i].data = [];
}

console.log(clone, items);

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

let items = [
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
    {ws: false, data: [1,2,3,4,5]},
];

function clones(arr) {
    return arr.map(item => {
        return { ...item, ...{ data: [ ...item.data ]}}
    });
}

let clone = clones(items);   

for (let i in items) {
    items[i].data = [];
}

console.log(clone, items);

Удалить переменную не получится, однако можно ее обнулить.

clone = null;

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

→ Ссылка