思路 其实不用管什么时间,星期,直接按固定数量进行填充即刻, 生成一个7 * 9 列的格子方阵,一共是63天 定一个json,并将63天的文章数据填充进去 如果最后一个篇文章是星期5,则可能会少2篇文章,此时填充2篇空文章进去 在生成格子的时候将文章数据附加进html元素内。 完成 <div class="grid-container" id="gridContainer"></div> .grid-container { display: grid; grid-template-columns: repeat(9, 20px); /* 9列,每列20px */ grid-template-rows: repeat(7, 20px); /* 7行,每行20px */ width: 200px; height: 200px; gap: 5px; /* 格子间的间隙 */ } .grid-column { display: grid; gap: 5px; } .grid-item { border: 1px solid #ddd; /* 边框颜色 */ display: flex; align-items: center; justify-content: center; } /* 根据字数给格子添加背景色 */ .word-count { font-size: 10px; } 1.0版本 const articles = [ {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, {word:1}, ]; // 将文章数据填充到格子中 function fillGrid(articles) { const gridContainer = document.getElementById('gridContainer'); const gridItemTemplate = document.createElement('div'); gridItemTemplate.className = 'grid-item'; // 填充格子 articles.forEach((article, index) => { // 复制模板格子 const gridItem = gridItemTemplate.cloneNode(false); gridItem.innerHTML = `<div class="word-count">${article.word}</div>`; // 确定格子位置,这里我们假设每列代表10天 const colIndex = Math.floor(index / 7); // 计算列索引 const rowIndex = index % 7; // 计算行索引 // 将格子插入到正确的位置 gridContainer.append(gridItem); }); } fillGrid(articles); 完整版 const data = [ {date:'2024-05-17'}, {date:'2024-05-01'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-03'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-05'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-05'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-25'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-3'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-04'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-30'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-06'}, {date:'2024-05-17'}, {date:'2024-05-17'}, {date:'2024-05-02'}, {date:'2024-05-17'}, ]; // 将字符串日期转换为日期对象的函数 function parseDate(str) { return new Date(str); } // 获取今天是星期几(0-6,0代表星期天,1代表星期一,以此类推) function getDayOfWeek(date) { return date.getDay(); } // 找到最近的星期天的日期 function getSundayBeforeDate(date) { const dayOfWeek = getDayOfWeek(date); // 如果今天是星期天,直接返回今天 if (dayOfWeek === 0) return date; // 否则,往前找最近的星期天 return new Date(date.getTime() - dayOfWeek * 24 * 60 * 60 * 1000); } function getThisSunday(date) { // 获取今天是星期几,1是星期天,2是星期一,依此类推 const dayOfWeek = date.getDay(); // 如果今天是星期天,直接返回这个日期 if (dayOfWeek === 0) { return date; } // 如果不是星期天,计算到这个星期天还需要多少天 // 因为getDay()中0是星期天,所以我们需要减去当前的dayOfWeek const daysToSunday = 7 - dayOfWeek; // 创建一个新日期,代表这个星期天 const thisSunday = new Date(date); thisSunday.setDate(thisSunday.getDate() + daysToSunday); return thisSunday; } // 今天的日期 const today = new Date('2024-05-17'); // 找到最近的星期天 const sunday = getThisSunday(today); // 创建一个从最近的星期天往前推63天的日期对象 let startDate = new Date(sunday); startDate.setDate(sunday.getDate() - 62); // 初始化结果数组 const result = []; // 转换所有日期并统计每个日期出现的次数 const dateCounts = {}; data.forEach(item => { const dateObj = parseDate(item.date); const dateStr = dateObj.toISOString().split('T')[0]; dateCounts[dateStr] = (dateCounts[dateStr] || 0) + 1; }); // 填充结果数组 for (let currentDate = sunday; currentDate >= startDate; currentDate.setDate(currentDate.getDate() - 1)) { // 格式化日期为字符串 const dateStr = currentDate.toISOString().split('T')[0]; // 计算今天的日期在原始数据中出现的次数 const count = dateCounts[dateStr] || 0; // 找到所有匹配当前日期的对象 const dataContent = data.filter(item => parseDate(item.date).toISOString().split('T')[0] === dateStr); // 添加到结果数组中 result.push({ date: dateStr, count: count, data: dataContent }); } // 根据星期一列降序排列结果数组 result.sort((a, b) => { return a.date > b.date ? -1 : 1; }); // 将现有的 fillGrid 函数改为填充每一列的格子 function fillGrid(articles) { const gridContainer = document.getElementById('gridContainer'); const gridItemTemplate = document.createElement('div'); gridItemTemplate.className = 'grid-item'; // 填充格子 articles.slice().reverse().forEach((article, index) => { // 复制模板格子 const gridItem = gridItemTemplate.cloneNode(false); gridItem.innerHTML = `<div class="word-count" data=${article.date}>${article.count}</div>`; // 确定格子位置,这里我们假设每列代表10天 const colIndex = Math.floor(index / 7); // 计算列索引 const rowIndex = index % 7; // 计算行索引 // 将格子插入到正确的位置 if (rowIndex === 0) { const gridColumn = document.createElement('div'); gridColumn.className = 'grid-column'; gridContainer.appendChild(gridColumn); } const gridColumns = document.getElementsByClassName('grid-column'); gridColumns[colIndex].append(gridItem); }); } fillGrid(result); 4o精简后的代码 function parseDate(str) { return new Date(str); } function getThisSunday(date) { const dayOfWeek = date.getDay(); const daysToSunday = dayOfWeek === 0 ? 0 : 7 - dayOfWeek; const thisSunday = new Date(date); thisSunday.setDate(thisSunday.getDate() + daysToSunday); return thisSunday; } const today = new Date('2024-05-17'); const sunday = getThisSunday(today); let startDate = new Date(sunday); startDate.setDate(sunday.getDate() - 62); const result = []; const dateCounts = {}; data.forEach(item => { const dateStr = parseDate(item.date).toISOString().split('T')[0]; dateCounts[dateStr] = (dateCounts[dateStr] || 0) + 1; }); for (let currentDate = sunday; currentDate >= startDate; currentDate.setDate(currentDate.getDate() - 1)) { const dateStr = currentDate.toISOString().split('T')[0]; const count = dateCounts[dateStr] || 0; const dataContent = data.filter(item => parseDate(item.date).toISOString().split('T')[0] === dateStr); result.push({ date: dateStr, count: count, data: dataContent }); } function fillGrid(articles) { const gridContainer = document.getElementById('gridContainer'); const gridItemTemplate = document.createElement('div'); gridItemTemplate.className = 'grid-item'; articles.slice().reverse().forEach((article, index) => { const gridItem = gridItemTemplate.cloneNode(false); gridItem.innerHTML = `<div class="word-count" data=${article.date}></div>`; const colIndex = Math.floor(index / 7); const rowIndex = index % 7; if (rowIndex === 0) { const gridColumn = document.createElement('div'); gridColumn.className = 'grid-column'; gridContainer.appendChild(gridColumn); } const gridColumns = document.getElementsByClassName('grid-column'); gridColumns[colIndex].append(gridItem); }); } fillGrid(result);