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

Is there a better way to refactor this for loop with map or reduce?

我对 javascript 有点陌生,所以请多多关照。我有一个包含 for 循环的 post。我想用 .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);
});

非常简单,map 的工作方式类似于 each,但允许 return 转换元素。但是你还需要一个过滤功能来删除你不想要的元素。

对于每一个对象,是否转换(设置数量),然后return它或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 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce):

let products = data.products.reduce((result, product) => {
  id = product.id.toString();
  if (cart.hasOwnProperty(id)) {
    product.qty = cart[id];
    result.push(product);
  }
  return result;
}, []);

我还没有测试过,但应该可以。