在EJS中查找两个数组之间的匹配项

时间:2020-04-06 03:38:57

标签: express ejs knex.js

我正在使用node,express,knex,postgres,EJS和bootstrap。我有一个表deckorderfil,它具有ordnbr的主键列。我的另一张表decktowfil,有一个ordnbr的外键,引用了deckorderfil。

我遇到的问题是,我似乎无法让EJS只打印那些与deckorderfil相匹配的decktowfil结果。

通过以下操作,我已经成功地弄清楚了如何在对URL进行GET请求后如何显示两个结果:

我的index.js路由:

router.get('/dashboard', authMiddleware.ensureLoggedIn, function(req, res) {
  Tow.getTows().then(tows => {
    Job.getJobs().then(jobs => {
    jobs = JSON.parse(JSON.stringify(jobs)); //deckorderfil table
    tows = JSON.parse(JSON.stringify(tows)); //decktowfil table
    res.render('dashboard', { title: 'Express', jobs: jobs, tows: tows });
  });
    });
});

我的dashboard.ejs:

<% for (let i = 0; i < jobs.length; i++) { %> <!-- deckorderfil (primary key) table -->
  <%= jobs[i].ordnbr %>
  <% } %>

<% for (let j = 0; j < tows.length; j++) { %> <!-- decktowfil (foreign key) table -->
    <%= tows[j].ordnbr %>

  <% } %>

dashboard.ejs打印以下内容:

D1 D2 D3 (the jobs ordnbr's) D1 D1 D2 (the tows ordnbr's)

我的问题是,如何创建一个IF语句,说明“如果作业ordnbr是D1,则只返回也等于D1的丝束ordnbr,并为每个这些都创建div”?

我已经成功地循环了我的EJS以产生div,该div显示了每个deckorderfil ID及其其他变量。我正在尝试将匹配的decktowfil记录作为这些div嵌入到这些div中。这是我要完成的事情的图片。

enter image description here

我应该通过Knex,EJS还是jquery / javascript来做到这一点?如果是这样,那么在哪里和什么时候?到目前为止,我已经尝试将HTML中的父元素的ID设置为deckorderfil ordnbr,然后将我的EJS查询与此匹配,但这没有用。

谢谢,如果您还需要其他任何答案,请告诉我。

2 个答案:

答案 0 :(得分:0)

在不知道对象确切形状的情况下,这是一种可行的实现方式:

Express应用

const jobs = [
  {
    orderNum: 'D1'
  },
  {
    orderNum: 'D2'
  },
  {
    orderNum: 'D3'
  },
];

const tows = [
  {
    orderNum: 'D1',
    orders: [
      1,
      2,
      3,
    ],
  },
  {
    orderNum: 'D2',
    orders: [
      1,
      2,
      3,
    ],
  },
  {
    orderNum: 'D3',
    orders: [
      1,
      2,
      3,
    ],
  },
];

app.get('/', (req, res, next) => {
  res.render('index', { jobs, tows });
});

Index.ejs *

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <style type="text/css">
      .outer {
        border: 1px solid red;
        padding: 18px;
        margin: 12px;
      }
      .inner {
        margin: 12px;
        padding: 12px;
        border: 1px solid green;
      }
    </style>
  </head>
  <body>

    <% for (let i = 0; i < jobs.length; i++) { %>
      <div class="outer">      
        <p>Jobs<%= jobs[i].orderNum %></p>
          <% tows.find(tow => tow.orderNum === jobs[i].orderNum).orders.forEach(order => { %>
          <div class="inner">

            <p>Tows: id <%= order %></p>

          </div>
          <% }); %>
      </div>
    <% } %>
  </body>
</html>

结果:

enter image description here

答案 1 :(得分:0)

好,我知道了。都是为了弄清楚如何嵌套for循环并正确设置div。

这是我构造EJS以获得正确输出的方式。我不需要使用.find()运算符。

<% for (let i = 0; i < jobs.length; i++) { %>
    <div class="outer">
    <p>Jobs <%= jobs[i].ordnbr %></p>
    <% for (let j = 0; j < tows.length; j++) { %>
        <% if (tows[j].ordnbr === jobs[i].ordnbr) { %>
            <div class="inner">
                <p>Tow: <%= tows[j].tow_id %></p>
            </div>
        <% } %>
        <% } %>
    </div>
    <% } %>

谢谢Daniel的帮助。你激发了我的创造力。