【问题标题】:Better way to write multiple switch cases in multiple foreach methods?在多个 foreach 方法中编写多个 switch 案例的更好方法?
【发布时间】:2021-07-06 11:46:25
【问题描述】:

我正在尝试制作一个网络应用程序,人们可以在其中将一周中某天的锻炼添加到例行程序中,并且它会在一个页面上显示他们的整个例程。我还希望练习的名称链接到相应的页面。例如,我的数据在 mongodb 中是这样的:

_id:60e2edf7014df85fd8b6e073
routineName:"test"
routineUsername: "tester"
monday:[{
    _id: 60e430d45395d73bf41c7be8
    exercise: "Bicep curls"
}{
    _id: 60e4329592e3fa445836d983
    exercise: "Overhead press"
}]
tuesday:[{
    _id:60e2ee8962c0c15840ecc69b
    exercise:"Hanging leg raise"
}] 
..etc

我在 EJS 中有这个:

<% routine.monday.forEach(monday => { %>
    <ul>
    <% switch (monday.exercise) {
        case 'Hanging leg raise' : %>
        <a href="/muscles/abs/hanginglegraise"><li><%= monday.exercise %></li></a>
                <% break;
            
        case 'Bicep curls' : %>
        <a href="/muscles/biceps/bicepcurls"><li><%= monday.exercise %></li></a>
                <% break;
            
        case 'Calf raises' : %>
        <a href="/muscles/calves/calfraises"><li><%= monday.exercise %></li></a>
                <% break;

        case 'Barbell bench press' : %>
        <a href="/muscles/chest/barbellbenchpress"><li><%= monday.exercise %></li></a>
                <% break;

        case 'Incline bench press' : %>
        <a href="/muscles/chest/inclinebenchpress"><li><%= monday.exercise %></li></a>
                <% break;

        case 'Overhead press' : %>
        <a href="/muscles/frontdeltoids/overheadpress"><li><%= monday.exercise %></li></a>
                <% break;

        case 'Barbell squat' : %>
        <a href="/muscles/quadriceps/barbellsquat"><li><%= monday.exercise %></li></a>
                <% break;

        case 'Shrugs' : %>
        <a href="/muscles/trapezius/shrugs"><li><%= monday.exercise %></li></a>
                <% break;
    } %>
    </ul>
<% }) %>
..etc

但正如您所见,我必须在一周的每一天重复此代码 7 次,每次都使用 switch case,这样我才能将练习转到正确的链接。我觉得这是一种糟糕且低效的方法,但我不知道/想不出更好的方法,我们将不胜感激。

【问题讨论】:

  • 旁注:&lt;li&gt;&lt;a&gt; 的无效子代。 &lt;a&gt; 应该是 &lt;li&gt; 的孩子
  • 啊,谢谢你的提示
  • 制作函数?
  • 我不知道如何在 ejs 中做到这一点,或者如果我把它放在外面我不知道如何让它包含链接

标签: javascript node.js mongodb ejs


【解决方案1】:

一个好的做法是使用对象。您可以调用像foo.barfoo['bar'] 这样的对象。 因此,首先创建一个对象,例如:

const exercices = {
'Hanging leg raise': <a href="/muscles/abs/hanginglegraise"><li></a>
// Fill with the rest
...
}

routine.monday.forEach(monday => { %>
    <ul>
exercices[monday.exercice]
</ul>
} %>

使用这种设计模式有你需要的基础。

或者

routine.monday.forEach(monday => { %>
    <ul>
      <a href=`/muscles/abs/${monday.exercice.trim()}`><li><%= monday.exercise %></li></a>
    </ul>
} %>

【讨论】:

  • 嗨,我不知道如何像你在 ejs 中那样创建一个 const,如果我尝试在 javascript 中创建,它会给我一个错误,因为我正在尝试使用 html在javascript中。
  • 另外,修剪不只是删除字符串两端的空格吗?所以它不会删除单词之间的空格?
  • @ChanKim:关键是,找到从exercise 派生该链接的方法,因为这是您的开关臂之间唯一的可变部分。例如,将其存储在数据库中。您的示例数组显示您正在存储 id 和 name,但您没有使用 id。反过来做:删除名称,仅存储 id。渲染页面时,通过 id 获取所有练习(这将是他们自己集合中的自己的文档)并从中读取链接。
  • @ChanKim 是的,你是对的,修剪不会删除中间的空格,我暂时忘记了这一点。你想要的最好的方法就像@SergioTulentsev 说的,只依赖id。您在 ejs 部分之外添加该逻辑,您可以将数据传递给您的 ejs 文件,如 res.render('index',{exercise: monday.exercise}); 并在您的 .ejs 文件中调用 &lt;%=exercise%&gt;
  • 好吧,我现在觉得自己很傻但是不太明白,不好意思哈哈。你们是说我应该从数据库中删除“练习”字段并将其替换为“链接”之类的内容,例如,这将是页面的链接而不是练习的名称,对吧?对不起,我没听懂
猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 2018-07-07
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多