JS / Javascript Использование .push или .unshift для отслеживания истории переменной - PullRequest
0 голосов
/ 06 июня 2011

Я работаю над читателем книг.У меня есть переменная currentPostition, которая, как следует из ее названия, всегда знает, где в книге находится пользователь.Я пытаюсь создать историю местоположения пользователей, чтобы я мог добавить кнопку назад, как веб-браузер.Итак, в настройках у меня есть:

currentPostition;  //this is a json object with book,chapter,page stored in it.
history = [];          //array of json objects

Затем, когда пользователь перемещается (есть несколько различных типов навигации):

history.push(currentPostition);  //save in history before updating currpos

//put new values in currentPosition
currentPostition.book = foo;
currentPostition.chapter = foo;
currentPostition.page = foo;

Пока все хорошо, верно?Ну проблема такая.Мой массив истории растет в длину, как и следовало ожидать.НО, каждая запись в массиве истории будет такой же, как последний объект, помещенный в массив.IE:

for (x=0;v<history.lenght;x++){
   document.write(history[x].book+","+history[x].chapter+","+history[x].page+"<br />");
}

приведет к выводу что-то вроде

3rdBookPosition, 3rdChapterPosition, 3rdPagePosition 3rdBookPosition, 3rdChapterPosition, 3rdPagePosition 3rdBookPosition, 3rdChapterPosition, 3rdPagePosition

Итак, я в замешательстве, потому что ожидаю вывод типа:

1stBookPosition, 1stChapterPosition, 1stPagePosition 2ndBookPosition, 2ndChapterPosition, 2ndPagePosition 3rdBookPosition, 3rdChapterPosition, 3rdPagePosition

What amЯ делаю не так?К вашему сведению, я пробовал unshift и history[history.length], а также в сети такие же результаты.

Заранее спасибо, Джев

Ответы [ 2 ]

0 голосов
/ 06 июня 2011

В основном все в JS передается по ссылке.Итак, вы добавляете в массив только ссылку на currentPostition.Вам нужно назначить новый пустой объект перед использованием currentPostition в другой раз:

currentPostition = {};
0 голосов
/ 06 июня 2011

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

Чтобы избежать этой проблемы, вам нужно использовать new currentPosition, либо используя ключевое слово new, если у вас есть функция конструктора, либо просто копируя объект в другой объект, например, $.extend({},currentPosition) с помощью jQuery. 1010 *

Надеюсь, эта помощь.

Edit: Вы можете создать свою собственную функцию extends, что-то вроде этого:

function extends(destObject,srcObject){
  for(var i in srcObject){
    destObject[i] = srcObject[i];
  }
}

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

var oldPos = extends({},currentPosition);
history.push(oldPos);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...