根据数据库中的产品过滤购物车项目

时间:2019-07-19 22:41:22

标签: javascript node.js

大家好,这是我使用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-使用地图和过滤器方法尝试了很多,但每次都会造成混乱!
:(

2 个答案:

答案 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数组。)

通过使用findsome代替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],
  }))