如何使用 foreach 在 Nodejs 中获取数组的总和?

Posted

技术标签:

【中文标题】如何使用 foreach 在 Nodejs 中获取数组的总和?【英文标题】:How to get a sum of an array in Nodejs using foreach? 【发布时间】:2018-09-20 21:45:12 【问题描述】:

我有一个名为“植物”的数组/模式,并填充在网页上。我想得到工厂费率的总和(最后一项)。我如何在 Nodejs 中做到这一点?

下面是显示带有模式数据的植物表的模板:

<% project.plants.forEach(function(plant) %>
                  <tr>

                     <td class="td14" ><%= plant.noplant %></td>
                     <td class="td15" ><%= plant.plantname %></td>
                     <td class="td16" ><%= plant.planthrperday %></td>
                     <td class="td17" ><%= plant.plantnodays %></td>
                     <td class="td18" ><%= plant.planthrrate %></td>
                     <td class="td19" ><%= plant.plantdep %></td>
                     <td class="td20" ><%= plant.plantrate %></td>
                     <td class="td21"><a href=""><button type="button" class="btn btn-danger">Remove</button></a></td>

                   </tr>
                <% ); %>

路由处理程序:

    app.get("/myprojects/:id/cost", function(req,res)

    Project.findById(req.params.id).populate("labours materials tools plants others").exec(function(err, foundProject)
        if(err)
            console.log(err);
            else
          res.render("cost", project: foundProject);   
        

    );

  );

【问题讨论】:

让 sum = 0; project.plants.forEach(function(plant) sum = sum + plant.plantrate 【参考方案1】:

您可以使用reduce,如下:

const plantsRateSum = project.plants.reduce((accumulator, currValue) =>
  return acumulator + currValue.plantrate;
, 0);

Docs: Array.prototype.reduce()

或者在您的特定情况下,在获取植物数组后计算总和:

Project.findById(req.params.id).populate("labours materials tools plants others").exec(function (err, foundProject) 
  if (err) 
    console.log(err);
   else 
    const plantsRateSum = foundProject.reduce((accumulator, currValue) => 
      return acumulator + currValue.plantrate;
    , 0);
    res.render("cost",  project: foundProject, plantsRateSum: plantsRateSum );
  
);

【讨论】:

【参考方案2】:

您可以像我在下面所做的那样在模板中执行此操作,方法是声明一个变量 plantRateSum 并在每次迭代 forEach 时将 plantrate 添加到该变量中

<% var plantRateSum = 0;  %>

<% project.plants.forEach(function(plant) %>
          <% plantRateSum += plant.plantrate %> 
           enter code here
                  <tr>

                     <td class="td14" ><%= plant.noplant %></td>
                     <td class="td15" ><%= plant.plantname %></td>
                     <td class="td16" ><%= plant.planthrperday %></td>
                     <td class="td17" ><%= plant.plantnodays %></td>
                     <td class="td18" ><%= plant.planthrrate %></td>
                     <td class="td19" ><%= plant.plantdep %></td>
                     <td class="td20" ><%= plant.plantrate %></td>
                     <td class="td21"><a href=""><button type="button" class="btn btn-danger">Remove</button></a></td>

                   </tr>
                <% ); %>

但这不是一个好方法,您应该使用reduce 方法将工厂费率总和从路由处理程序发送到模板,如下所示:

const plantRateSum = project.plants.reduce(function(sum, plant)
  return sum + plant.plantrate;
, 0);

现在将这个plantRateSum 传递给模板。

在您的路由处理程序中执行以下操作:

 app.get("/myprojects/:id/cost", function(req,res)
    Project.findById(req.params.id).populate("labours materials tools plants others").exec(function(err, foundProject)
      if (err) 
        console.log(err);
       else 
        var plantRateSum = foundProject.plants.reduce(function(sum, plant)
          return sum + plant.plantrate;
        , 0); 
        res.render("cost", project: foundProject, plantRateSum:plantRateSum);   
      
    );
  );

【讨论】:

路由处理程序有点复杂,不知道怎么加:app.get("/myprojects/:id/cost", function(req,res) Project.findById (req.params.id).populate("劳动材料工具厂其他").exec(function(err, foundProject) if(err) console.log(err); else res.render("cost" , project: foundProject); ); ); @Sam 请将路由处理程序添加到您的问题中,因为在评论中很难阅读:) 对不起,我添加到问题中

以上是关于如何使用 foreach 在 Nodejs 中获取数组的总和?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS - 如何使 forEach 和 for 循环函数顺序

foreach 如何在 react-redux 中工作

NodeJS:等待所有带有 Promises 的 foreach 完成,但从未真正完成

如何在刀片foreach循环中获取迭代次数

如何在 ForEach 循环中获取计数变量

在 forEach 之后使用 Promise.all() 渲染 NodeJS 页面之前等待 Firebase 数据加载