大家好,这是我使用Node.js和js(ofcos)开发的第一个项目。 所以我到达了要向用户显示存储在用户购物车中的产品之前,我要检查该产品是否仍存在于数据库中或已被删除,以及是否已从数据库中删除,所以我不想显示该产品在用户购物车中
所以在猫鼬方法中
userschema.methods.checkcart = function(product) {
let products=product
console.log(products) //stores all products that exist in db
};
给我
[
{
_id: 5d31f00d6f2a111ebd6e98da,
title: 'Pepsi',
imageurl: 'https://target.scene7.com/is/image/Target/GUEST_26aa6df7-2fdf-4b4b-9f3b-d2ea31b5d685?wid=488&hei=488&fmt=pjpeg',
price: 12,
description: 'Hard !',
userid: 5d31e70115a10b1b5f7e6ed6,
__v: 0
},
{
_id: 5d31f0486f2a111ebd6e98db,
title: 'Burger!',
imageurl: 'https://www.seriouseats.com/recipes/images/2015/07/20150702-sous-vide-hamburger-anova-primary-1500x1125.jpg',
price: 123,
description: 'Tasty.',
userid: 5d31e70115a10b1b5f7e6ed6,
__v: 0
},
]
现在我要寻找用户在购物车上拥有的产品
let cartproducts=this.cart.items
console.log(cartproducts) //gives
[
{
"_id": "5d322eb241f5e836068485db",
"productid": "5d31f00d6f2a111ebd6e98da",
"quantity": 2
},
{
"_id": "5d322ec041f5e836068485dc",
"productid": "5d31f0486f2a111ebd6e98db",
"quantity": 1
},
{
"_id": "5d322ec741f5e836068485dd",
"productid": "5d31f0636f2a111ebd6e98dc",
"quantity": 1
}
]
现在,您可以看到ID为 5d31f0636f2a111ebd6e98dc 的产品已从数据库中删除,因此我想对其进行过滤,仅返回购物车和数据库中的产品。
P.s-使用地图和过滤器方法尝试了很多,但每次都会造成混乱!
:(
答案 0 :(得分:1)
const products = [
{
_id: '5d31f00d6f2a111ebd6e98da',
title: 'Pepsi',
imageurl: 'https://target.scene7.com/is/image/Target/GUEST_26aa6df7-2fdf-4b4b-9f3b-d2ea31b5d685?wid=488&hei=488&fmt=pjpeg',
price: 12,
description: 'Hard !',
userid: '5d31e70115a10b1b5f7e6ed6',
__v: 0
},
{
_id: '5d31f0486f2a111ebd6e98db',
title: 'Burger!',
imageurl: 'https://www.seriouseats.com/recipes/images/2015/07/20150702-sous-vide-hamburger-anova-primary-1500x1125.jpg',
price: 123,
description: 'Tasty.',
userid: '5d31e70115a10b1b5f7e6ed6',
__v: 0
},
];
const cartProducts = [
{
"_id": "5d322eb241f5e836068485db",
"productid": "5d31f00d6f2a111ebd6e98da",
"quantity": 2
},
{
"_id": "5d322ec041f5e836068485dc",
"productid": "5d31f0486f2a111ebd6e98db",
"quantity": 1
},
{
"_id": "5d322ec741f5e836068485dd",
"productid": "5d31f0636f2a111ebd6e98dc",
"quantity": 1
}
];
const productIds = products.map(prod => prod._id);
const filteredCartProducts = cartProducts
.filter(prod => productIds.includes(prod.productid));
console.log(filteredCartProducts);
答案 1 :(得分:1)
使用products
生成数组时,您需要遍历所有元素以查找其是否包含数组。较大的数据集效果不好。
已过滤的购物车商品:
cartproducts.filter(item => products.some(product => product._id === item.productid))
您可能同时需要购物车商品和产品。可以这样实现:
cartproducts
.map(item => ({
item,
product: products.find(product => product._id === item.productid),
}))
.filter(both => both.product)
({filter
之后的{map
,不要两次搜索products
数组。)
通过使用find
和some
代替Rocky Sims答案中的includes
,您不需要额外的productIds
数组。
通常在数据库中,您会在_id
上有一个索引,以便快速找到它。
您的products
可能不是一个数组,而是一个对象,其中键是产品的_id
:
const productsById = {
5d31f00d6f2a111ebd6e98da: {
_id: '5d31f00d6f2a111ebd6e98da',
title: 'Pepsi',
// [...]
},
5d31f0486f2a111ebd6e98db: {
_id: '5d31f0486f2a111ebd6e98db',
title: 'Burger!',
// [...]
},
}
products
数组可以转换为这样的对象:
const productsById = products.reduce(
(map, product) => {
map[product._id] = product
return map
},
{}
)
然后将非常容易且高效地进行过滤:
cartproducts.filter(item => item.productid in productsById)
两者:
cartproducts
.filter(item => item.productid in productsById)
.map(item => ({
item,
product: productsById[item.productid],
}))