Господа, прошу помощи, ибо никак не могу организовать логику скрипта, который находил
бы нужные объекты и вставлял их в разметку. Подробности ниже.
Есть таблица календаря, которая генерится а js, есть массив объектов, каждый объект
хранит в себе информацию о годе+месяце (year), дне месяца (day), событии (event), остальные
параметры не так важны. Нужен скрипт, который будет пробегать по массиву, сверять месяц+год
календаря с месяцем+годом в объектах, если все совпадает, то далее пробегать по таблице
и сверять день календаря с днями в объектах, если совпадает, то в ячейку с совпадающей
датой добавлять div с event, хранящимся в объекте.
Сейчас происходит почти то что нужно, НО если в массиве есть несколько объектов с
совпадающими day объекта и днем календаря, то в ячейку с датой добавляется ТОЛЬКО первый
объект, остальные игнорируются.
Вот так это выглядит сейчас:
let arr = [{
dateEvent: "Первый тест",
day: "11",
description: "Первый тест",
event: "Первый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Второй тест",
day: "11",
description: "Первый тест",
event: "Первый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Третий тест",
day: "11",
description: "Первый тест",
event: "Первый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Четвертый тест",
day: "10",
description: "Первый тест",
event: "Первый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
]
const showAllEvents = () => {
let arrEvents = arr,
list = document.getElementById("organizer").getElementsByTagName('td');
//берем первый день - внешний цикл
for (let j = 0; j < list.length; j++) {
//первый объект в массиве - внутренний цикл
for (let i = 0; i < arrEvents.length; i++) {
//проверяем соответсвие месяца и года с данными в объекте
if (document.getElementById('year').innerHTML === arrEvents[i].year) {
//проверяем день календаря и день объекта
if (list[j].innerHTML === arrEvents[i].day) {
//тут слайсится Событие
let text = arrEvents[i].event,
slicedEvent = text.slice(0, 15);
if (slicedEvent.length < text.length) {
slicedEvent += '...';
}
//создаем див, в него вставляем дивы с данными, которые должны хранится
в ячейке
let appendDiv = document.createElement('div');
appendDiv.className = 'event-div';
appendDiv.innerHTML = `
Прошу сильно ссаными тряпками не кидаться, а объяснить что происходит, кажется я
не совсем верно понимаю работу циклов. Или же в логике ошибка?
Ответы
Ответ 1
Проблема в том, что вы сравниваете list[j].innerHTML === arrEvents[i].day. После
первого успешного совпадения list[j].innerHTML уже не будет только текст 11, потому
что вы добавляете туда несколько новых элементов document.getElementsByTagName('td')[j].appendChild(appendDiv);.
Для обхода этой ситуации можно хранить данные в data-* атрибутах элемента. Вообще,
лучше данные хранить там, и по возможности стараться избегать сравнений вида list[j].innerHTML
=== arrEvents[i].day.
Пример работающего кода.
let arr = [{
dateEvent: "Первый тест",
day: "11",
description: "Первый тест",
event: "Первый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Второй тест",
day: "11",
description: "Первый тест",
event: "Второй тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Третий тест",
day: "11",
description: "Первый тест",
event: "Третий тест",
names: "Первый тест",
year: "Октябрь 2017"
},
{
dateEvent: "Четвертый тест",
day: "10",
description: "Первый тест",
event: "Четвертый тест",
names: "Первый тест",
year: "Октябрь 2017"
},
]
const showAllEvents = () => {
let arrEvents = arr,
list = document.getElementById("organizer").getElementsByTagName('td'),
year = document.getElementById('year');
//берем первый день - внешний цикл
for (let j = 0; j < list.length; j++) {
let td = list[j];
//первый объект в массиве - внутренний цикл
for (let i = 0; i < arrEvents.length; i++) {
let event = arrEvents[i];
//проверяем соответсвие месяца и года с данными в объекте
if (year.innerHTML === event.year) {
//проверяем день календаря и день объекта
if (td.getAttribute("data-day") === event.day) {
//тут слайсится Событие
let text = event.event,
slicedEvent = text.slice(0, 15);
if (slicedEvent.length < text.length) {
slicedEvent += '...';
}
//создаем див, в него вставляем дивы с данными, которые должны хранится
в ячейке
let appendDiv = document.createElement('div');
appendDiv.className = 'event-div';
appendDiv.innerHTML = `
Комментариев нет:
Отправить комментарий