![](/img/trans.png)
[英]How to select only products with ids from ids array. MongoDB
[英]List the products from an array based on ids from another object
我有阵列
[
{
"id": "1",
"Name": "Name 1",
"Price": 10,
"inventory": 1,
"date_added": 1496757350
},
{
"id": "2",
"Name": "Name 2",
"Price": 40,
"inventory": 1,
"date_added": 1496757290
},
...
]
和对象
{
'1':2,
'2':15
'10':5
}
像这样。 因此,第一个包含产品,对象包含产品的ID(键)以及将其添加到购物车的次数(值)。 我要实现的是,在基于对象的另一个对象数组中,基本上列出产品。 因此,在这种情况下,该列表中将有3个产品。 我在这里有点迷路...缩小,过滤,映射....我应该如何进行? 谢谢
如果要列出另一个对象中可用的产品(使用产品ID作为键),则需要filter
const products = [ { "id": "1", "Name": "Name 1", "Price": 10, "inventory": 1, "date_added": 1496757350 }, { "id": "2", "Name": "Name 2", "Price": 40, "inventory": 1, "date_added": 1496757290 }, ] const ids = { '1': 2 } console.log(products.filter(product => product.id in ids))
您可以过滤产品并使用购物车数量构建新的结果集。
var products = [{ id: "1", Name: "Name 1", Price: 10, inventory: 1, date_added: 1496757350 }, { id: "2", Name: "Name 2", Price: 40, inventory: 1, date_added: 1496757290 }, { id: "4", Name: "Name 4", Price: 30, inventory: 1, date_added: 1496757290 }], cart = { 1: 2, 2: 15, 10: 5 }, selectedProducts = products.filter(function (o) { return o.id in cart; }); console.log(selectedProducts.map(function (o) { return ['id', 'Name'].map(function (k) { return k + ': ' + o[k]; }).concat('count: ' + cart[o.id]).join('; '); }));
您可以使用reduce
通过id制作产品地图:
{
id: { /* ... product */ }
}
您可以使用Object.keys
并map
来迭代购物车中的ID:
Object.keys(cart).map(id => productMap[id])
这样可确保您仅循环浏览商品列表一次,而不是购物车中的每个商品一次。
另请注意,如果您向我们展示您的尝试,您可能会从中得到更多的帮助。 您知道reduce
和map
做什么吗?
const products = [ { "id": "1", "Name": "Name 1", "Price": 10, "inventory": 1, "date_added": 1496757350 }, { "id": "2", "Name": "Name 2", "Price": 40, "inventory": 1, "date_added": 1496757290 }, { "id": "10", "Name": "Name 10", "Price": 40, "inventory": 1, "date_added": 1496757290 } ] const cart = { "1": 2, "2": 15, "10": 5 }; const productsById = products .reduce((map, prod) => Object.assign(map, { [prod.id]: prod }), {}); const list = Object .keys(cart) // Here, you can make any combination you like // since both data are retrievable by id // Only products: //.map(id => productsById[id]); // Combination .map(id => ({ product: productsById[id], quantity: cart[id] })); console.log(list);
您可以创建一个输出对象,并添加该项目的次数。
var items = [{ "id": "1", "Name": "Name 1", "Price": 10, "inventory": 1, "date_added": 1496757350 }, { "id": "2", "Name": "Name 2", "Price": 40, "inventory": 1, "date_added": 1496757290 }]; var cart = { '1': 2, '2': 15, '10': 5 } var output = {}; for (id in cart) { item = items.find(x => x.id === id); if (item != null) output[id] = { item: item, count: cart[id] }; } console.log(output);
出于速度原因,为了在数组中查找等,我倾向于使用另一个关联的数组来创建一种索引。 像下面这样。
var products = [ { "id": "1", "Name": "Name 1", "Price": 10, "inventory": 1, "date_added": 1496757350 }, { "id": "2", "Name": "Name 2", "Price": 40, "inventory": 1, "date_added": 1496757290 } ]; var basket = { '1':2, '2':15 }; //first lets create a kind of index to products.. var ixProducts = products.reduce((a, v) => { a[v.id] = v; return a; }, {}); Object.keys(basket).forEach((k) => { console.log({ qty: basket[k], product: ixProducts[k] }); });
let result = products.filter(function( obj ) {
return (Object.keys(quantityObject).indexOf(obj.id) !== -1);
});
这样的事吗? 过滤器检查对象id是否存在于数量对象的键中,并根据结果返回true或false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.