有没有更好的方法用 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;
}, []);
我还没有测试过,但应该可以。
我对 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;
}, []);
我还没有测试过,但应该可以。