Как сохранить массив в JavaScript?
-
06-07-2019 - |
Вопрос
Вот код, который имеет два массива (np и op), один из которых является копией другого.
Однако когда я изменяю копию, оригинал тоже изменяется!взглянем:
<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>
Есть ли способ сохранить оригинал и изменить копию?
Решение
Вы никогда не делали копию массива. Вы просто присвоили массив другой переменной. Это не копировать в Javascript. В вашем примере есть только один массив с двумя переменными, по которым вы можете получить к нему доступ. В Javascript нет встроенного способа копирования массивов, поэтому для этого вам нужно написать собственную функцию.
Посмотрите этот вопрос StackOverflow , чтобы узнать, как на самом деле реализовать копирование элементов в массиве.
Другие советы
Некоторые из встроенных функций Array фактически создадут для вас копию. Одним из таких является ломтик.
Например:
var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)
Ссылка http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165 р>
То, что вы делаете, - это не создание копии массива, а создание только копии ссылки на массив, поэтому вы получаете две ссылки на один и тот же объект массива.
Вот как вы можете создать фактическую копию массива:
var np = op.concat();
Метод concat
создает новый массив, который является копией массива с добавлением любых дополнительных элементов. Если вы не укажете никаких дополнительных элементов, вы просто получите копию массива.
Array.prototype.copy = function() {
return this.slice(0, this.length);
}
Затем
var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)
Вы должны клонировать второй массив, а не копировать его. Р>
--- Обновление
Если вы назначаете объект переменной, копируется только ссылка (это означает, что они оба указывают на одни и те же данные). Для получения независимой копии этого объекта вам необходимо клонировать его. И есть несколько способов сделать это, например здесь - способ клонирования объекта с использованием jQuery.
Вы можете просто использовать собственный метод slice
, который возвращает копию массива:
var np = op.slice(0,op.length);
Второй параметр должен быть необязательным, но в IE я считаю, что это необходимо.
Ваш код, дополненный изменением:
var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)
Чтобы создать новый массив, вы можете рассмотреть следующие вопросы:
var op = [];
Чтобы скопировать массив:
var np=op.slice();
или
var np=op.concat();
concat работает быстрее, а срез занимает на один символ меньше.Некоторые люди называют «срез» или «конкат» словом «копия», чтобы было более очевидно, что вы делаете копию.
В обоих случаях параметры не нужны.Параметры в срезе просто сделают код больше и медленнее.