#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));
Что также работает.