The Code

            
              const events = [
              {
                event: "ComicCon",
                city: "New York",
                state: "New York",
                attendance: 240000,
                date: "06/01/2017",
              },
              {
                event: "ComicCon",
                city: "New York",
                state: "New York",
                attendance: 250000,
                date: "06/01/2018",
              },
              {
                event: "ComicCon",
                city: "New York",
                state: "New York",
                attendance: 257000,
                date: "06/01/2019",
              },
              {
                event: "ComicCon",
                city: "San Diego",
                state: "California",
                attendance: 130000,
                date: "06/01/2017",
              },
              {
                event: "ComicCon",
                city: "San Diego",
                state: "California",
                attendance: 140000,
                date: "06/01/2018",
              },
              {
                event: "ComicCon",
                city: "San Diego",
                state: "California",
                attendance: 150000,
                date: "06/01/2019",
              },
              {
                event: "HeroesCon",
                city: "Charlotte",
                state: "North Carolina",
                attendance: 40000,
                date: "06/01/2017",
              },
              {
                event: "HeroesCon",
                city: "Charlotte",
                state: "North Carolina",
                attendance: 45000,
                date: "06/01/2018",
              },
              {
                event: "HeroesCon",
                city: "Charlotte",
                state: "North Carolina",
                attendance: 50000,
                date: "06/01/2019",
              },
            ];
            
            function getEvents() {
              let storedString = localStorage.getItem("gh-events") || "[]";
            
              let storedEvents = JSON.parse(storedString);
            
              if (storedEvents.length == 0) {
                storedEvents = events;
                localStorage.setItem("gh-events", JSON.stringify(events));
              }
              return storedEvents;
            }
            
            function buildDropDown() {
              // get the current events
              let currentEvents = getEvents();
            
              // get a list of unique cities
              let eventCities = currentEvents.map((event) => event.city);
              let distinctCities = new Set(eventCities);
              let dropdownChoices = ["All", ...distinctCities];
              const dropdownDiv = document.getElementById("city-dropdown");
              const dropdownItemsTemplate = document.getElementById("dropdown-template");
            
              buildDropDown.innerHTML = "";
              // with each unique city:
            
              dropdownChoices.forEach((city) => {
                // - copy the dropdown template
                let dropdownItemsCopy = dropdownItemsTemplate.content.cloneNode(true);
                // - change that copy's text
                let aTag = dropdownItemsCopy.querySelector("a");
                aTag.innerText = city;
                // - put it in the dropdown
                dropdownDiv.appendChild(dropdownItemsCopy);
              });
            
              document.getElementById("stats-location").textContent = "All";
              displayEvents(currentEvents);
              displayStats(currentEvents);
            }
            
            function displayEvents(events) {
              // find the table on the page
              const eventsTable = document.getElementById("events-table");
            
              // find the table row template
              const eventTemple = document.getElementById("table-row-template");
            
              // clear out the table
              eventsTable.innerHTML = "";
            
              // for each event:
              for (let i = 0; i < events.length; i++) {
                // - get one event
                let event = events[i];
            
                //- clone the template
                let tableRow = eventTemple.content.cloneNode(true);
            
                // - get each property of an event
                // - insert each property into the cloned template
                let eventNameCell = tableRow.querySelector("[data-id='event']");
                eventNameCell.innerText = event.event;
            
                tableRow.querySelector("[data-id='city']").innerText = event.city;
                tableRow.querySelector("[data-id='state']").innerText = event.state;
                tableRow.querySelector("[data-id='attendance']").innerText =
                  event.attendance;
            
                // format the date using toLocaleDateString
                let date = new Date(event.date);
                let formattedDate = date.toLocaleDateString();
                tableRow.querySelector("[data-id='date']").innerText = formattedDate;
            
                eventsTable.appendChild(tableRow);
              }
            }
            
            function displayStats(events) {
              let total = 0;
              let max = 0;
              let min = events[0].attendance;
              for (let i = 0; i < events.length; i++) {
                let event = events[i];
            
                total += event.attendance;
                if (event.attendance > max) {
                  max = event.attendance;
                }
            
                if (event.attendance < min) {
                  min = event.attendance;
                }
              }
            
              let average = total / events.length;
            
              document.getElementById("total-attendance").innerHTML =
                total.toLocaleString();
              document.getElementById("average-attendance").innerHTML =
                Math.round(average).toLocaleString();
              document.getElementById("max-attended").innerHTML;
              document.getElementById("min-attended").innerHTML;
            }
            
            function filterEvents(dropdownItemClicked) {
              let cityName = dropdownItemClicked.innerText;
              document.getElementById("stats-location").textContent = cityName;
            
              let allEvents = getEvents();
            
              let filteredEvents = [];
            
            
              filteredEvents = allEvents.filter(
                (event) => cityName == "All" || event.city == cityName
              );
            
             
            
              displayStats(filteredEvents); // overall stats
              displayEvents(filteredEvents); // table
            }
            
            function saveEvent() {
              let eventName = document.getElementById("inputEventName").value;
              let city = document.getElementById("inputCity").value;
            
              let stateSelect = document.getElementById("newEventState");
              let selectedIndex = stateSelect.selectedIndex;
              let selectedOption = stateSelect.options[selectedIndex];
              let state = selectedOption.text;
            
              let attendance = parseInt(document.getElementById("inputAttendance").value);
            
              let date = document.getElementById("inputEventDate").value;
              date = `$(date) 00:00`;
            
              let newEventDate = new Date(date);
            
              let newEvent = {
                event: eventName,
                city: city,
                state: state,
                attendance: attendance,
                date: newEventDate,
              };
            
              let allEvents = getEvents();
            
              allEvents.push(newEvent);
            
              localStorage.setItem("gh-events", JSON.stringify(allEvents));
            
              buildDropDown();
            
              let modalElement = document.getElementById("addEvent");
              let modal = bootstrap.Modal.getInstance(document.getElementById("addEvent"));
              modal.hide();
            }
            
              
            
          
Code Explanation

This script is designed to present information about events through a table and provide statistical data regarding the events. The events array is made up of objects that represent each event, including details like event name, location, attendance, and date. The getEvents function retrieves events from local storage, but if there are no stored events, it defaults to the original events array. The buildDropDown function fills a dropdown menu with unique cities from the current events. The displayEvents function showcases the events in table form using a template to create each row. Lastly, the displayStats function calculates and exhibits statistics regarding the events, such as total attendance, maximum attendance, and minimum attendance.