有没有更好的方法可以通过map或reduce来进行循环重构?

时间:2019-05-17 15:00:00

标签: javascript ecmascript-6 ecmascript-7

我对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);
});

2 个答案:

答案 0 :(得分:1)

除非您要在数组中使用null元素,否则我不认为可以用map来重写它。可能应该使用reducehttps://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;
}, []);

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

答案 1 :(得分:-3)

非常简单,地图就像每个地图一样工作,但是允许返回转换后的元素。但是您还需要过滤器功能来删除不需要的元素。

对于每个对象,对其进行转换或不转换(设置数量),然后将其返回或为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;
  });
);