VueJS, перемещаемый в массив, также перемещает значение в другой массив

#javascript #vue.js #vuejs2

Вопрос:

У любого ветерана vuejs это происходит на VueJS(v2), где у вас есть 2 массива на компоненте, и вы передаете значение в 1-й массив, а 2-й массив также получает значение, НЕ ПРИКАСАЯСЬ К НЕМУ.

Это первый раз, когда я сталкиваюсь с этим, к вашему сведению, я использую VueJS уже более 2 лет.

Дополнительная информация У меня есть ОЧЕНЬ похожий компонент с точно таким же data variables , и этого не происходит, только на 2-м компоненте.

 array1 = [];
array2 = [];

array1.push('gether');
 

результат должен быть

 array1 = ['gether'];
array2 = [];
 

ЧТО НА САМОМ ДЕЛЕ ПРОИСХОДИТ

 array1 = ['gether'];
array2 = ['gether'];
 

Я также играл с отладчиком Google DevTools Vue.

Добавление записи в поле array1 «ТОЛЬКО» также добавляет значение в поле array2 .

немного умопомрачительно

Комментарии:

1. Можете ли вы воспроизвести проблему в CodeSandbox или аналогичном?

2. @Lars Я еще не пробовал, но, похоже, это происходит, когда я присваиваю одно и то же значение array1 и array2, ЗАТЕМ я добавил запись в array1, а затем array2 также получает значение волшебным образом, и наоборот, когда я добавляю запись в array2, array1 тоже получает значение волшебным образом.

3. Можете ли вы добавить еще немного кода ? Я думаю, что вы справляетесь с массивом от 1 до 2 … Проверьте эту скрипку js

4. @Sanmeet, очевидно, мой код слишком сложен, чтобы его можно было воспроизвести в codesandbox, но кто-то ответил на мой вопрос, и это именно то, что происходит.

5. @Skeeith22 проверьте ответ, это тоже то, с чем я сталкивался в прошлом, поэтому я просто хотел посмотреть, создаете ли вы массивы или копируете !

Ответ №1:

Поскольку массивы в JS являются ссылочными значениями, поэтому при попытке скопировать его с помощью = он будет копировать только ссылку на исходный массив, а не значение массива. Чтобы создать реальную копию массива, вам нужно скопировать значение массива в новую переменную значения. Таким образом, этот новый массив не ссылается на старый адрес массива в памяти.

Для этого вы можете использовать array.slice() метод, так как он создает новый массив, а не просто ссылку !

Смотрите Пример и разбирайтесь в различиях =>

Использование ссылки (=)

 let array = ["some text"]

// Making it equal to main array  and using reference to copy 
array1 = array;
array2 = array;

array1.push('gether');
console.log(array2)
 

Использование array.slice() для клонирования

 let array = ["some text"]

// Making it equal to main array and using slice to copy 
array1 = array.slice(); 
array2 = array.slice();

array1.push('gether');

console.log(array2)
 

Ответ №2:

Когда вы делаете два массива равными одному и тому же значению, вы делаете их равными по ссылке. Так

 foo = ['a', 'b', 'z']

array1 = foo;
array2 = foo;

array1.push('d');

console.log(array2) //Outputs: ['a', 'b', 'c', 'd']
 

Это ожидаемое поведение.

Однако это не то же самое, что в приведенном примере в вашем вопросе. Запустите фрагмент ниже, чтобы увидеть разницу.

Чтобы избежать этого, вы можете использовать slice() для создания копии исходного массива. Я добавил пример к фрагменту кода.

 let foo = ["a", "b"];

let array1 = foo;
let array2 = foo;

array2.push("c");

console.log(foo); // Outputs ["a", "b", "c"]
console.log(array1); // Outputs ["a", "b", "c"]

let array3 = [];
let array4 = [];

array4.push("a");

console.log(array3); // Outputs []
console.log(array4); // Outputs ["a"]

let bar = ["a", "b"];

let array5 = bar.slice();

bar.push("c");

console.log(bar); // Outputs ["a", "b", "c"]
console.log(array5); // Outputs ["a", "b"] 

Комментарии:

1. На самом деле это то, что происходит, это именно то, о чем вы упомянули. Я назначил точно одинаковые значения для обоих массивов.

2. Как я могу сделать так, чтобы это не отражалось на другом массиве? есть ли способ или что-то в этом роде?

3. @Skeeith22 я добавил решение к ответу.