如何使用 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 循环函数顺序