繁体   English   中英

根据另一个对象的ID列出数组中的产品

[英]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.keysmap来迭代购物车中的ID:

Object.keys(cart).map(id => productMap[id])

这样可确保您仅循环浏览商品列表一次,而不是购物车中的每个商品一次。

另请注意,如果您向我们展示您的尝试,您可能会从中得到更多的帮助。 您知道reducemap做什么吗?

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM