代码之家  ›  专栏  ›  技术社区  ›  Richlewis

在视图中分组我的数据-nodejs

  •  0
  • Richlewis  · 技术社区  · 6 年前

    路线.js

    app.get('/fixtures', async (req, res) => {
      const fixtures = await queries.getFixtures();
      res.render('fixtures', { fixtures });
    });
    
    fixtures returns
    [ { id: 27,
        home_team: 'Chelsea',
        away_team: 'Liverpool',
        league_name: 'English Premiership',
      },
      { id: 25,
        home_team: 'Man Utd',
        away_team: 'Everton',
        league_name: 'English Premiership',
      },
      { id: 30,
        home_team: 'Istanbul Basaksehir',
        away_team: 'Akhisar Belediye',
        league_name: 'Turkish Super Lig',
      }
    ]
    

    async function getFixtures() {
      let response;
      try {
        response = await pool.query('select * from fixtures ORDER BY league_name ASC');
      } catch (e) {
        console.error('Error Occurred', e);
      }
      return response.rows;
    }
    

    固定装置.ejs

    <% fixtures.forEach((fixture) => { %>
       <p><%=fixture.league_name %></p>
       <p><%= fixture.home_team %> vs <%= fixture.away_team %> </p>
    <% }) %>
    

    所以上面会输出

    English Premiership
    Chelsea vs Liverpool
    
    English Premiership
    Man Utd v Everton
    
    Turkish Super Lig
    Istanbul Basaksehir vs Akhisar Belediye
    

    不过,我想分组我的赛程由联赛,并希望有作为输出视图

    English Premiership
    Chelsea vs Liverpool
    Man Utd v Everton
    
    Turkish Super Lig
    Istanbul Basaksehir vs Akhisar Belediye
    

    我该如何实现这一目标?这是DB查询级别的操作还是我在视图中执行的操作?(但我想这可能不是保持逻辑的最佳地方)

    1 回复  |  直到 6 年前
        1
  •  2
  •   The Alpha    6 年前

    我不知道你用的是什么工具/库,但不依赖于任何库/工具,你可以用香草 JavaScript

    app.get('/fixtures', async (req, res) => {
    
        const fixtures = await queries.getFixtures();
    
        const grouped = groupByLeagueName(fixtures);
    
        res.render('fixtures', { fixtures: grouped });
    });
    

    然后,实施 groupByLeagueName 功能如下:

    function groupByLeagueName(fixtures) {
    
        return fixtures.reduce((result, item) => {
    
            result[item.league_name] = result[item.league_name] || [];
    
            result[item.league_name].push(item);
    
            return result;
    
        }, {});
    }
    

    <% for (let leagueName in fixtures) { %>
    
        <p><%= leagueName %></p>
    
        <% fixtures[leagueName].forEach((match, key) => { %>
    
            <p><%= match.home_team %> vs <%= match.away_team %> </p>
    
        <% }) %>
    
    <% } %>