我有一个看起来像这样的结构:
[{id:1, amount:2},{id:3, amount:4}]
'标识'表示产品的ID以及订单的数量。所以我想得到每个产品的价格并将其添加到变量中(例如:total =(product1.price * amount1)+(product2.price * amount2)+ ...但我不知道如何在没有for循环的情况下执行此操作并且在使用node.js时我在for循环中执行查询时遇到问题。价格行存储在名为" product"。
的表中有没有办法避免它..?如果没有for循环,查询看起来像这样:
pool.getConnection(function(err, connection) {
if(err) {
console.log(err);
callback(true);
return;
}
var total = 0;
//for loop with query to add each product*quantity to total ?
connection.query("SELECT price FROM product WHERE id_product = ? ", [id_product], function(err, results) {
connection.release();
if(err){
console.log(err);
callback(true);
return;
}
... // Do something
});
});`
忘记提到数组可能更大或只包含1个元素。
答案 0 :(得分:0)
我假设你想避免发出多个查询而不是一个批处理SELECT。要优化此功能,您可以使用其价格获取所有产品,也可以使用id_product IN (ID1, ID2, ID3, ...)
子句。
要将所有ID收集到一个数组中,您可以使用Array.prototype.map
:
var idsArray = myArray.map((myObj) => myObj.id));
假设您使用mysql
驱动程序,您的批量选择可能如下所示:
connection.query(
"SELECT id_product, price FROM product WHERE id_product IN (?)",
[ idsArray ],
callback
);
通常,您无法避免在此任务中使用“循环”。像reduce
这样的东西,有些库可能提供复杂的sum
函数,但它们的实现仅依赖于循环。
但是没有必要避免循环。与“查询部分”中显示的批量选择结合使用时,汇总价格的最佳方法是使用Array.prototype.reduce
:
var total = myArray.reduce((prev, myProduct) => {
// Assuming you've put query result inside "prices" object with ID mapping
return prev + (myProduct.amount * prices[myProduct.id]);
}, 0);
注意:我的示例使用Arrow functions语法,因此请确保您拥有支持ES2015 +的最新节点。如果您愿意,也可以切换回匿名函数。