Целевой идентификатор селектора запросов при сопоставлении значения в объекте

#javascript #arrays #json #sorting #object

#javascript #массивы #json #сортировка #объект

Вопрос:

Я не могу понять, как правильно настроить таргетинг и отобразить тег HTML id, когда соответствующий соответствующий JS-объект, содержащийся в массиве, имеет «живое» значение true.

Я хочу, чтобы цикл JS отображал ссылку в модуле расписания, только если этот идентификатор ссылки соответствует «ScheduleId» объекта и когда «живое» значение этого объекта равно true. Как мне настроить таргетинг и отобразить эту ссылку?

Смотрите мой HTML здесь:

 

<div class="test-schedule">
   <h2>Schedule</h2>
   <div><span>School of Ed</span><a class="link-class" id="ed">School of Ed link</a></div>
   <div><span>School of Humanities</span><a class="link-class" id="hss">School of Humanities link</a></div>
   <div><span>School of Science</span><a class="link-class" id="sci">School of Science link</a></div>
   <div><span>School of Nursing</span><a class="link-class" id="nursing">School of Nursing link</a></div>
</div>


<style>
.link-class{display:none}
</style>

 

JS здесь:

 const eventList = [

  {
    scheduleId: 'ed',
    live: 'true',
  },
  {
    scheduleId: 'hss',
    live: 'false',
  },
  {
    scheduleId: 'sci',
    live: 'false',
  },
  {
    scheduleId: 'nursing',
    live: 'false',
  },
];
 

Ссылка на Codepen:
https://codepen.io/lvl12sealclubber/pen/PoWbJZQ?editors=1011

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

1. я не понимаю вашу проблему .. это не ясно

2. Спасибо @Frenchy, я пересмотрел свой пост, чтобы помочь уточнить.

Ответ №1:

Если я правильно понимаю, вы хотите, чтобы все ссылки были скрыты и отображали только некоторые на основе значения JS? Не могли бы вы просто сделать:

 .link-class {
    visibility: hidden;
}
 
 for (let event of eventList) {
    if (event.live) {
        document.getElementById(event.scheduleId).style.visibility="visible" 
    }
}
 

Ответ №2:

Если я понимаю, что вы хотите показать ссылку на это событие в зависимости от того, является ли событие активным для объекта events, вы можете попробовать что-то простое, например, создать класс, который будет отображать элемент следующим образом

 const eventList = [
  {
    scheduleId: "ed",
    live: "true",
  },
  {
    scheduleId: "hss",
    live: "false",
  },
  {
    scheduleId: "sci",
    live: "true",
  },
  {
    scheduleId: "nursing",
    live: "false",
  },
];

const checkLinks = () => {
  for (let event of eventList) {
    if (event.live === "true") {
      document.querySelector("#"   event.scheduleId).classList.add("show-link");
      console.log(event.scheduleId);
    }
  }
};

checkLinks(); 
 .link-class {
  display: none;
}

.show-link {
  display: inline-block;
  color: blue;
} 
     <div class="test-schedule">
      <h2>Schedule</h2>
      <div>
        <span>School of Ed </span
        ><a class="link-class" id="ed">School of Ed link</a>
      </div>
      <div>
        <span>School of Humanities </span
        ><a class="link-class" id="hss">School of Humanities link</a>
      </div>
      <div>
        <span>School of Science </span
        ><a class="link-class" id="sci">School of Science link</a>
      </div>
      <div>
        <span>School of Nursing </span
        ><a class="link-class" id="nursing">School of Nursing link</a>
      </div>
    </div> 

Ответ №3:

Я бы обновил тип данных для свойства ‘live’ до логического значения вместо строки.

В реальном мире это будет зависеть от данных, и вам не придется сравнивать даты, а просто проверить свойство ‘live’, если оно true или нет.

Если я правильно понимаю, когда пользователь попадает на эту страницу, вы вычисляете текущую дату / время и показываете, какое событие находится в режиме реального времени. Если это так, вы можете просто сравнить текущую дату / время и показать ссылку на ту, которая находится в режиме реального времени. Обновлять не нужно event.live . На самом деле, вы не должны обновлять свои данные через JS.

Кроме того, вместо обновления стиля для баннера через JS просто сохраняйте заполнитель сверху и управляйте стилями через CSS. Я не видел значения, чтобы сделать это через JS.

Ответ №4:

Вы могли filter бы удалить ненужные элементы массива, а затем использовать простой forEach для отображения. Что-то вроде этого:

 const eventList = [{
  scheduleId: 'ed',
  live: 'true',
}, {
  scheduleId: 'hss',
  live: 'false',
}, {
  scheduleId: 'sci',
  live: 'false',
}, {
  scheduleId: 'nursing',
  live: 'true',
}];

const scheduleEl = document.querySelector("#schedule")
eventList
  .filter(event => event.live === 'true')
  .forEach(event => {
    scheduleEl.innerHTML  = `<p>- ${event.scheduleId}</p>`;
  }); 
 <p>Live event schedule:</p>
<div id="schedule">
</div>