Нежелательное двойное присвоение функции массива

#javascript #jquery

#javascript #jquery ( jquery ) #jquery

Вопрос:

 function myFunction()
{     
    var Arr2
    if(Arr1!=null)
    {
        Arr2=Arr1
        console.log("Arr2 before for: " Arr2)
        console.log("Arr1 before for: " Arr1)
    }               
    for(var index=-1 Arr2.length;index>=0;index--)
    {
        if(Arr2[index]=="to_delete")
        {
            Arr2.splice(index,1)
        }
    }
    console.log("Arr1 after for: " Arr1)
    console.log("Arr2 after for: " Arr2)
}
  

Я создаю Arr2 в функции, Arr2=Arr1, проблема в том, что Arr1 также соединяется во время for и с этих последних двух консолей.журналы мне сообщают, что эти 2 массива одинаковы. (Я только хочу изменить Arr2)

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

1. Когда вы говорите Arr2=Arr1 , вы в основном делаете Arr2 другое имя для Arr1 . Вместо этого вам нужно сделать копию Arr1 .

2. нужно сделать Arr2 = [...Arr1]

3. ES6 еще не полностью поддерживается, и в OP ничего не говорится о возможности использования синтаксиса ES6.

4. @Enzey Я просто хотел дать другую перспективу тем, кто читает этот вопрос. В конце концов, если вы используете JS, вы также используете ES6.

Ответ №1:

Когда вы это делаете Arr2 = Arr1 , вы просто копируете ссылку на этот массив, вы не создаете копию самого массива. Таким образом, оба Arr1 и Arr2 теперь будут ссылаться на один и тот же массив.

Попробуйте изменить

 Arr2=Arr1
  

Для

 Arr2 = Arr1.slice()
  

который должен скопировать все элементы в Arr1 новый Arr2 . Проверьте Array.prototype.slice для получения дополнительной информации.

Ответ №2:

Вы могли бы просто использовать метод filter Array следующим образом :

 var arr2 = arr1.filter(x => x!="to_delete");
  

Ответ №3:

Вы создаете ссылку на Arr1, а не на новый объект. Подумайте об этом так: введите описание изображения здесь

Подумайте об этом так: когда вы инициализируете Arr1, вы выделяете его в часть памяти в куче. Затем этой ссылке присваивается адрес.

Присваивание var Arr2 = Arr1 равно тому, что Arr2 совпадает с Arr1 по ссылке. Это означает, что он указывает на один и тот же адрес памяти.

Если вы хотите создать копию объекта, иначе передать его по значению, вам следует использовать один из следующих методов.

 var Arr2 = Arr1.slice(0);
  

Однако имейте в виду, что если ваш массив содержит объекты, они клонируются по ссылке с помощью этого метода. Пример:

 var Arr1 = [{a: 1, b: 2, c:3}, {d: 4, e: 5, f: 6}]
var Arr2 = Arr1.slice(0)
Arr1[0].a = 2;
console.log(Arr2[0].a) // this will output 2
  

Если вы хотите легко выполнить глубокое клонирование без необходимости писать код для передачи ссылок на объекты по значению, вы можете использовать что-то вроде Lodash или просто:

 var Arr2 = JSON.parse(JSON.stringify(Arr1));
  

Что также работает.