簡體   English   中英

避免使用for循環來獲取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
);

JS循環部分:

通常,您無法避免在此任務中使用“循環”。 有諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM