所以我一直在尝试自己解决这个问题,因为它看起来非常简单,但是我无法做到这一点,没有任何可以帮助我的东西出现在这里。所以我决定问一下。我正在使用ExpressJS btw。
我有一个名为'notes'的MySQL表,其中包含以下架构:
+----------+
| Field |
+----------+
| id |
| title |
| body |
| author |
| date |
| time |
+----------+
所以在从db获取这些数据后,我想在页面上这样:
- unique date
- title
- body
- author
- title
- body
- author
- unique date
- title
- body
- author
由于每一行都有自己的日期和某些文章的日期相同,我只想在页面上只显示一次日期,并且只显示标题,正文,作者和时间(如果它是相同的日期)。有点像时间轴。
我试过的是比较“for”循环中的音符,就像这样(在我的 notes.ejs 中):
<% for(i=0; i<notes.length; i++) {%>
<% if(notes[i].date != notes[i+=1].date) {%>
<li><%= notes[i].title %></li>
<%} %>
<%} %>
但是, i + = 1 会在当前迭代中为 i 设置新值,但我无法正确显示结果。
这可能很简单,但我无法做对。
答案 0 :(得分:0)
i + 1 是获取加一值而无需将新值设置为 i
的方法答案 1 :(得分:0)
你当然可以在模板中做到这一点,但我真的不建议。在将其传递给view / templater之前,我宁愿看到你进行合并/分组。
您是否可以访问templater之外的下划线/ lodash? _.groupBy()对于像这样的问题来说是理想的。
// this assumes that your sql results are actual dates.
// if they aren't, skip the `toISOString()`
let grouped = _.groupBy(sqlResults, result => result.date.toISOString());
let dates = _.unique(sqlResults.map(result => result.date.toISOString()));
// or just read dates from the `grouped` keys, if you dont want them separately
let data = { grouped, dates };
return res.render('view.ejs', data);
使用模板(或与此类似的东西):
<% for (let date of dates) {%>
<h4><%= date %></h4>
<ul>
<% for (let obj of grouped[date]) {%>
<li><%= obj.title %></li>
<%} %>
</ul>
<%} %>