如何在此代码中使用循环,使其更短并动态更新 UI?

How to use a loop in this code, make it shorter and dynamically update the UI?

我正在开发天气/旅游应用程序。输入位置后,会显示 7 天的天气预报。天气数据是从我的 server.js 获取并发送到我的 formHandler.js。 我很难理解如何使用循环为 7 个预测日中的每一天动态填充 7 个 forecastDivs 的逻辑。我怎样才能最好地实现我的目标?

我的服务器代码将收集的数据从 API 发送到 formHandler.js:

// forecast data points
        let arrivalDayIndex = req.body.daysTillDep;
        let returnDayIndex = arrivalDayIndex + 7;


// an array to store this data:
        const WeatherDataArray = data.data
        const tripWeatherArray = []

        for(let i = arrivalDayIndex; i <= returnDayIndex; i++ ){
            tripWeatherArray.push(WeatherDataArray[i])
            }

            projectData.temps = tripWeatherArray.map(dayData => dayData.temp)
            projectData.descriptions = tripWeatherArray.map(dayData => dayData.weather.description)
            projectData.icons = tripWeatherArray.map(dayData => dayData.weather.icon)
            projectData.dates = tripWeatherArray.map(dayData => dayData.valid_date.split("-").reverse().join("-"))

        res.send(projectData);
        console.log(projectData);


    } catch (error) {
        console.log('error', error)
    }
}

// Add a GET route that returns the projectData object
app.get('/all', function (req, res) {
    res.send(projectData);
  })

发送到 formHandler.js 的数据示例:

{
  placeName: 'City Center',
  country: 'ES',
  temps: [
    23.9, 19.5, 17.6,
    21.6, 20.6, 19.9,
    19.6, 19.5
  ],
  descriptions: [
    'Overcast clouds',
    'Scattered clouds',
    'Scattered clouds',
    'Overcast clouds',
    'Scattered clouds',
    'Few clouds',
    'Broken clouds',
    'Overcast clouds'
  ],
  icons: [
    'c04d', 'c02d',
    'c02d', 'c04d',
    'c02d', 'c02d',
    'c03d', 'c04d'
  ],
  dates: [
    '21-05-2021',
    '22-05-2021',
    '23-05-2021',
    '24-05-2021',
    '25-05-2021',
    '26-05-2021',
    '27-05-2021',
    '28-05-2021'
  ]
}

这就是我现在在 formHandler.js 作品中所做的,但我希望能得到一些关于如何在此处使用循环的提示,这样我就可以使代码更短并动态更新UI.

const updateUI = async () => {
    const request = await fetch('http://localhost:3030/all');

    try{
        const allData = await request.json();
        console.log(allData)

        document.getElementById('day0').innerHTML =
            `<div class="date"><span>${allData.dates[0]}</span></div>
            <div class="temp"><span>${allData.temps[0]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[0]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[0]}.png">`;

        document.getElementById('day1').innerHTML =
            `<div class="date"><span>${allData.dates[1]}</span></div>
            <div class="temp"><span>${allData.temps[1]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[1]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[1]}.png">`;

        document.getElementById('day2').innerHTML =
            `<div class="date"><span>${allData.dates[2]}</span></div>
            <div class="temp"><span>${allData.temps[2]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[2]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[2]}.png">`;

        document.getElementById('day3').innerHTML =
            `<div class="date"><span>${allData.dates[3]}</span></div>
            <div class="temp"><span>${allData.temps[3]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[3]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[3]}.png">`;

        document.getElementById('day4').innerHTML =
            `<div class="date"><span>${allData.dates[4]}</span></div>
            <div class="temp"><span>${allData.temps[4]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[4]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[4]}.png">`;

        document.getElementById('day5').innerHTML =
            `<div class="date"><span>${allData.dates[5]}</span></div>
            <div class="temp"><span>${allData.temps[5]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[5]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[5]}.png">`;

        document.getElementById('day6').innerHTML =
            `<div class="date"><span>${allData.dates[6]}</span></div>
            <div class="temp"><span>${allData.temps[6]}</span> °C</div>
            <div class="description"><span>${allData.descriptions[6]}</span></div>
            <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[6]}.png">`;
    }
    catch (error) {
        console.log("error", error);
    }
};

欢迎对此代码进行任何改进。

谢谢!

使用 for 循环遍历数据 7 天。

const updateUI = async () => {
    //const request = await fetch('http://localhost:3030/all');

    try{
        //const allData = await request.json();
        const allData = await getDataStub(); // calling the data stub to simulate fetch api.
        //console.log(allData)
        
        for (let i = 0; i < 7; i++) {
        const divId = `day${i}`;
          document.getElementById(divId).innerHTML =
              `<div class="date"><span>${allData.dates[i]}</span></div>
              <div class="temp"><span>${allData.temps[i]}</span> °C</div>
              <div class="description"><span>${allData.descriptions[i]}</span></div>
              <img class="icon" src="https://www.weatherbit.io/static/img/icons/${allData.icons[i]}.png">`;
        }
    }
    catch (error) {
        console.log("error", error);
    }
};


const getDataStub = async () => {
  return new Promise((resolve, reject) => {
    const data = {
  placeName: 'City Center',
  country: 'ES',
  temps: [
    23.9, 19.5, 17.6,
    21.6, 20.6, 19.9,
    19.6, 19.5
  ],
  descriptions: [
    'Overcast clouds',
    'Scattered clouds',
    'Scattered clouds',
    'Overcast clouds',
    'Scattered clouds',
    'Few clouds',
    'Broken clouds',
    'Overcast clouds'
  ],
  icons: [
    'c04d', 'c02d',
    'c02d', 'c04d',
    'c02d', 'c02d',
    'c03d', 'c04d'
  ],
  dates: [
    '21-05-2021',
    '22-05-2021',
    '23-05-2021',
    '24-05-2021',
    '25-05-2021',
    '26-05-2021',
    '27-05-2021',
    '28-05-2021'
  ]
};
resolve(data);
  });
}

updateUI();
<!DOCTYPE html>
<html>
<head></head>
<body>

<div id="day0"></div>
<div id="day1"></div>
<div id="day2"></div>
<div id="day3"></div>
<div id="day4"></div>
<div id="day5"></div>
<div id="day6"></div>

</body>
</html>