Javascript 有没有更好的方法用map或reduce重构for循环?

Javascript 有没有更好的方法用map或reduce重构for循环?,javascript,ecmascript-6,ecmascript-2016,Javascript,Ecmascript 6,Ecmascript 2016,我对javascript有点陌生,所以请友好一点。我有一篇文章包含for循环。我想用.map重新编写循环,因为在这里我似乎可以这样做(有更好的方法吗?)我怎么做 这是我的密码 app.post('/api/products', (req, res) => { let products = []; let id = null; let cart = JSON.parse(req.body.cart); if (!cart) return res.json(products);

我对javascript有点陌生,所以请友好一点。我有一篇文章包含for循环。我想用.map重新编写循环,因为在这里我似乎可以这样做(有更好的方法吗?)我怎么做

这是我的密码

app.post('/api/products', (req, res) => {
  let products = [];
  let id = null;
  let cart = JSON.parse(req.body.cart);
  if (!cart) return res.json(products);
  // TODO: replace for loop with .map
  for (var i = 0; i < data.products.length; i++) {
    id = data.products[i].id.toString();
    if (cart.hasOwnProperty(id)) {
      data.products[i].qty = cart[id];
      products.push(data.products[i]);
    }
  }
  return res.json(products);
});
app.post('/api/products',(req,res)=>{
让产品=[];
设id=null;
让cart=JSON.parse(req.body.cart);
如果(!cart)返回res.json(产品);
//TODO:将for循环替换为.map
对于(var i=0;i
非常简单,map的工作方式类似于each,但允许返回转换后的元素。但您还需要一个过滤器函数来删除不需要的元素

对于每个对象,变换它或不变换它(设置数量),然后返回它或null,然后添加过滤函数以删除null元素:

return res.json(datas.products.map(function(e){

     if(cart[e.id.toString()])
     {
         e.qty = cart[e.id.toString()];
         return e;
     }
     else
     {
         return null;
     }

  }).filter(function(e){
     if(e)
       return true;
     else
       return false;
  });
);

我不认为你可以用
map
重写它,除非你想要数组中有空元素。可能应该使用
reduce
():


我还没有测试它,但它应该可以工作。

为什么要用
map
替换它?它不会使代码更快,也不会使代码更可读。由于
for
循环中的条件,您必须映射然后过滤。这是否值得,这是一种折腾;我不认为在这里使用map/filter有什么好处,只是如果你拿出一些功能会更好一些。@DaveNewton nitpick-但是你必须先过滤然后映射。有缺点-由于所有函数调用,速度会较慢。对于一个小集合来说,它可能并不重要。@Jamiec aaaaa hhh。。。好吧,这是一个很好的分析。不只是为了更“现代”而转换的一个很好的理由。@Jamiec(我刚刚看到你的第一条评论)我想我是在通过某种方式使用过滤器或映射使它看起来更“现代”之后。然而,你关于效率的论点超过了这个观点;for循环的
不包括每个元素。这是有效的。从技术上来说,这是我问题的答案,所以它赢了。然而,我最终可能会使用我的原稿,因为Jamiec在上面的评论中提出了一个很好的论点。非常感谢。
let products = data.products.reduce((result, product) => {
  id = product.id.toString();
  if (cart.hasOwnProperty(id)) {
    product.qty = cart[id];
    result.push(product);
  }
  return result;
}, []);