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

时间:2017-08-21 14:40:28

标签: javascript arrays javascript-objects

我有阵列

[
  {
    "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个产品。我在这里有点迷失...减少,过滤,映射....我该怎么办? 感谢

6 个答案:

答案 0 :(得分:1)

如果您要列出其他对象中可用的产品(使用产品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))




答案 1 :(得分:1)

您可以过滤产品并使用购物车数量构建新的结果集。

nullValue (default empty string): sets the string representation of a null value

答案 2 :(得分:1)

您可以使用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);




答案 3 :(得分:1)

您可以创建一个输出对象,并添加该项目的次数。



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);




答案 4 :(得分:1)

出于速度原因,对于数组中的查找等,我倾向于使用另一个关联数组创建一种索引。像下面的东西..



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]
  });
}); 




答案 5 :(得分:0)

let result = products.filter(function( obj ) {
    return (Object.keys(quantityObject).indexOf(obj.id) !== -1);
});

那样的东西?过滤器检查对象id是否存在于quantity对象的键中,并根据结果返回true或false