避免使用for循环来获取Node.js

时间:2016-09-06 21:31:31

标签: javascript mysql node.js

我有一个看起来像这样的结构:

[{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个元素。

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
);

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 functions语法,因此请确保您拥有支持ES2015 +的最新节点。如果您愿意,也可以切换回匿名函数。