Есть ли способ реорганизовать этот Javascript для цикла?

Это тестовый проект, который я использую для изучения Javascript. У меня есть цикл for с операторами if после этого, которые переходят в innerHTML. Вот цикл for ниже. Мне интересно, как я могу это сделать, скажем, map()? Я искал в Интернете информацию о том, как использовать карты (), но ничто не показывает вещи, которые немного сложнее, чем понимание новичка... что я новичок.

for (let i = 0; i < data.length; i++) {
        let dataTitle = data[i].title;
        let dataTimeFrames = data[i].timeframes.daily;

        if (dataTitle === 'Work') {
            hours_work.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_work.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
        if (dataTitle === 'Study') {
            hours_play.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_play.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
        if (dataTitle === 'Play') {
            hours_study.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_study.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
        if (dataTitle === 'Exercise') {
            hours_exercise.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_exercise.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
        if (dataTitle === 'Social') {
            hours_social.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_social.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
        if (dataTitle === 'Self Care') {
            hours_care.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
            past_care.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
        }
    }

Этот код отлично работает, я просто хочу научиться рефакторить что-то подобное.

Вот репо для дальнейшего понимания, если хотите: https://github.com/tmerrick17/панель управления отслеживанием времени

Цикл продолжает пытаться перезаписать одни и те же две вещи. Почему .map() уместно в этом случае?

VLAZ 20.03.2022 07:16

Вы можете сделать одну простую вещь — обновить все операторы if, кроме первых, до else if, чтобы они не проверялись в каждом цикле.

Ryan O'D 20.03.2022 07:27

либо вы можете использовать Switch Case

Nilesh Mishra 20.03.2022 07:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Итак, первое, что я бы сделал, это вместо того, чтобы ваши элементы уже были определены, а затем устанавливали их html, вы можете иметь функцию, которая захватывает правильный элемент на основе заголовка, поэтому я предполагаю, что у вас есть что-то вроде этого:

var hours_care = document.getElementById("hours_care")

вместо этого используйте функцию, которая захватывает нужные элементы на основе заголовка. Что-то вроде этого было бы хорошо:

function getHoursAndPast (title) {
  var lowerTitle = title.toLowerCase();
  var hours = document.getElementById("hours_" + lowerTitle)
  var past = document.getElementById("past_" + lowerTitle)
  return [hours, past]
}

Эта функция возвращает массив элементов, которые вы пытаетесь получить. Затем вы можете взять это и DE-структурировать этот массив внутри вашего цикла. Я бы не стал использовать карту, потому что вы не заинтересованы в получении массива из этого. Вместо этого используйте forEach

data.forEach(datum => {
  let dataTitle = datum.title;
  let dataTimeFrames = datum.timeframes.daily;
  const [hours, past] = getHoursAndPast(dataTitle);
  hours.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
  past.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
})

Большое спасибо за ваш отзыв. Я смог успешно использовать это ... высоко ценится!

tmerrick 23.03.2022 05:03

Один из подходов заключается в создании объекта, содержащего ссылки на элементы HTML. Это разбивает информацию, относящуюся к данным, из цикла, что упрощает управление. Конечно, вы по-прежнему имеете дело с несколько длинным dataObj, что не идеально.

const dataObj = {
  Work: {
    hoursElement: document.getElementById('hours_work'),
    pastElement: document.getElementById('past_work'),
  },
  Study: {
    hoursElement: document.getElementById('hours_study'),
    pastElement: document.getElementById('past_study'),
  }
  // Etc....
}

for (let i = 0; i < data.length; i++) {
  let dataTitle = data[i].title;
  let dataTimeFrames = data[i].timeframes.daily;

  dataObj[dataTitle].hoursElement.innerHTML = `<p>${dataTimeFrames.current}hrs</p>`;
  dataObj[dataTitle].pastElement.innerHTML = `<p>Yesterday - ${dataTimeFrames.previous}hrs</p>`;
}

Использование некоторых данные-* вместо идентификаторов значительно упростило бы вашу задачу.

Учитывая этот образец HTML (найденный на вашем GitHub):

<!-- Social Card -->
<div class = "card-social">
  <div class = "card-top card-img">
    <img src = "public/images/icon-social.svg" alt = "book icon">
  </div>
  <a class = "card-bot-anchor" href = "#">
    <div class = "card-bot card__info">
      <h2>Social</h2>
      <img src = "public/images/icon-ellipsis.svg" alt = "3 dots icon">
      <p id = "hours-social" data-title = "Self Care" data-timeframe = "current" class = "hours-current margin-top1">hrs</p>
      <p id = "past-social" data-title = "Self Care" data-timeframe = "previous"  class = "past-toggle">Category Toggle</p>
    </div>
  </a>
</div>

Обратите внимание на дополнения

data-title = "Self Care" data-timeframe = "current"

Ваш цикл будет

data.forEach(activity => {
  let r = activity.title,
    t = activity.timeframes.daily;

  document.querySelector(`[data-title='${r}'][data-timeframe='current']`).innerHTML = `<p class = "hours-current">${t.current}hrs</p>`);
  document.querySelector(`[data-title='${r}'][data-timeframe='previous']`).innerHTML = `<p>Yesterday - ${t.previous}hrs</p>`;
}

И скорее всего можно отбросить id и кучу созданных для них переменных.

Другие вопросы по теме