Итерация по массиву, вложенному внутри объекта

#javascript #arrays

#javascript #массивы

Вопрос:

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

Я пытаюсь перебрать массив URL-адресов, которые я вложил внутрь объекта. Чего я ожидаю, так это того, что URL-адреса (которые являются картами Google) будут отображаться на моем веб-сайте, а человек, использующий мой веб-сайт, сможет переходить между разными URL-адресами карты. Прямо сейчас происходит то, что последний элемент (URL-адрес Google maps) myCities.index отображается правильно, но когда я нажимаю кнопки «Предыдущий» и «Следующий», он переходит на пустую страницу. Я просмотрел свою консоль JS, и там нет никаких видимых ошибок. Кто-нибудь может дать мне несколько советов, как это исправить? Мой код выглядит следующим образом.

 const myCities = {
  index:
    [url1, url2, url3]
}

const prevButton = document.querySelector('.prevBtn');
const nextButton = document.querySelector('.nextBtn');
const map = document.getElementById("myCitiesss");

nextButton.addEventListener('click', nextCity);
prevButton.addEventListener('click', prevCity);

function prevCity() {
  myCities.index--;
  updateSrc();
  checkButtons();
}

function nextCity() {
  myCities.index  ;
  updateSrc();
  checkButtons();
 }

function updateSrc() {
  map.src = myCities.index;
}

function checkButtons() {
  prevButton.disabled = false;
    nextButton.disabled = false;  
  if (myCities.index === 2) {
    nextButton.disabled = true;
  }if (myCities.index === 0) {
prevButton.disabled = true;
}

}

updateSrc();
checkButtons();
 

Ответ №1:

Проблема в том, что вы обрабатываете myCities.index как контейнер ваших данных, так и счетчик (следовательно, вы выполняете операции увеличения / уменьшения над ним).

Счетчик должен быть отдельной переменной.

 const myCities = [url1, url2, url3]; //<-- can now be a flat array
let index = 0; //<-- this is our counter, i.e. tracker
 

Затем соответствующие изменения в коде: (Я также воспользовался возможностью, чтобы продемонстрировать некоторые оптимизации и повышения эффективности, которые вы можете внести)

 nextButton.addEventListener('click', () => nextPrevCity('next'));
prevButton.addEventListener('click', () => nextPrevCity('prev'));

function nextPrevCity(which) { //<-- one function to handle both next and prev
    which == 'next' ? index   : index--;
    map.src = myCities[index];
    checkButtons();
}

function checkButtons() {
    prevButton.disabled = false;
    nextButton.disabled = false;  
    if (index === myCities.length - 1) //<-- check against array length, not fixed number 2
        nextButton.disabled = true;
    if (!index) //<-- because 0 is a falsy value, so same as "if (index === 0)"
        prevButton.disabled = true;
}
 

[ — РЕДАКТИРОВАТЬ — ]

Забыл следующее в нижней части кода:

 map.src = myCities[0];
checkButtons();
 

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

1. Большое вам спасибо за эту невероятно полезную возможность обучения!

2. Нет проблем, и добро пожаловать в SO. Я внес несколько правок / исправлений, поэтому обязательно обновите.

3. Еще один вопрос, с этим ответом знаете ли вы, почему он начинается с отображения ошибки cannot GET / undefined перед нажатием кнопки next, но после нажатия на нее эта ошибка очищается и начинается с позиции [0] в массиве?

4. См. Редактирование — я забыл изменить последнюю часть вашего кода, два вызова функции. Если у вас все еще есть проблема, опубликуйте ее как скрипку JS, и я посмотрю.

5. jsfiddle.net/JetimLee/gn29f4Lq/2 отредактировано с помощью вашей правки, все еще была та же проблема! : D