![](/img/trans.png)
[英]For loop to get the total of all iterations in Javascript, using node.js
[英]Avoid using for loop to get total of a query in Node.js
我有一個看起來像這樣的結構:
[{id:1, amount:2},{id:3, amount:4}]
“ Id”代表產品的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個元素。
我假設您想避免發出多個查詢,而不是發出一批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函數語法,因此請確保您擁有支持ES2015 +的最新Node。 如果願意,還可以切換回匿名功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.