Как передать значение вместо ссылки массива?
У меня есть эта структура:
var a = [];
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"});
var b = a;
a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"});
console.log(b);
Теперь проблема в том, что b
имеет точный контент как a
(контент после второго нажатия). Это подсказывает (исправьте меня, если я ошибаюсь), что, когда я сказал b = a
, я фактически дал такую же ссылку как a, поэтому все, что я делаю в a
, есть в b
. Дело в том, что мне нужно передать значение. Поэтому у меня есть предварительный просмотр a
, значение в b
.
Изменить, чтобы сделать вопрос более ясным: как передать значение вместо ссылки?
Ответы
Ответ 1
Я думаю, вы можете использовать это, чтобы скопировать значение вместо ссылки:
var b = a.slice(0);
ИЗМЕНИТЬ
Как отмечалось в комментариях, и здесь также упоминается: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice
slice не изменяет исходный массив, но возвращает новую копию с одним уровнем глубины, которая содержит копии элементов, отрезанных от исходного массива. Элементы исходного массива копируются в новый массив следующим образом:
-
Для ссылок на объекты (а не на фактический объект) копии срезов
ссылки на объекты в новый массив. И исходный, и новый массив
обратитесь к одному и тому же объекту. Если объект, на который ссылается, изменяется, изменения
видны как для нового, так и для оригинального массивов.
-
Для строк и чисел (а не для объектов String и Number), копии срезов
строки и числа в новый массив. Изменения в строке или
число в одном массиве не влияет на другой массив.
Если новый элемент добавлен в любой массив, другой массив не будет затронут.
Ответ 2
вы можете реализовать метод клонирования следующим образом:
function clone(source) {
var result = source, i, len;
if (!source
|| source instanceof Number
|| source instanceof String
|| source instanceof Boolean) {
return result;
} else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') {
result = [];
var resultLen = 0;
for (i = 0, len = source.length; i < len; i++) {
result[resultLen++] = clone(source[i]);
}
} else if (typeof source == 'object') {
result = {};
for (i in source) {
if (source.hasOwnProperty(i)) {
result[i] = clone(source[i]);
}
}
}
return result;
};
то
var b = clone(a);
если вы уверены, что a является массивом, используйте только приложение Niklas:
var b = a.slice();
ps: мой английский беден:)
Ответ 3
Да, то, как ссылочное присвоение работает в javascript. Вы хотите клонировать объект, чтобы сделать копию, что, к сожалению, больше связано с тем, что должно быть. Ракурсы, такие как MooTools, предоставляют простейшее решение, или вы можете перевернуть свою собственную функцию clone
.