2017-08-21 134 views
0

产品我有阵列列表从阵列基于IDS从另一个对象

[ 
    { 
    "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种产品。我有点迷失在这里...减少,过滤器,地图....我应该如何继续? 谢谢

+3

可以显示基于上显示“输入”要创建精确的输出,? –

回答

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

+0

在此之后,我如何附加每个产品的数量?在ID后的上市工作很好,刚才我不得不附上数量... – Legycsapo

+1

在最后的'地图',你可以从'购物车'检索它。我将它添加到片段中。 – user3297291

+0

谢谢!这正在工作! – Legycsapo

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

这样的事情?筛选器检查数量对象的键是否存在对象ID,并根据结果返回true或false

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

你可以筛选产品,并建立一个新的结果与车的量设定。

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('; '); 
 
}));

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

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