我停留在显示购物车页面的位置,其中列出了用户添加到购物车的产品。 我有两个数组: 一个带有产品详细信息。
productDetails: [
{
productID: 1,
productTitle: 'Product Title 1',
productPrice: 2000
},
{
productID: 2,
productTitle: 'Product Title 2',
productPrice: 5000
},
{
productID: 3,
productTitle: 'Product Title 3',
productPrice: 1000
},
{
productID: 4,
productTitle: 'Product Title 4',
productPrice: 10000
}
],
另一个带有购物车产品详细信息的产品,其产品ID和数量仅由用户选择。
cartProducts: [
{
productID: 1,
quantity: 5,
},
{
productID: 3,
quantity: 2,
}
]
我已经过滤掉用户选择的所有产品。
cartItemDetails() {
return this.productDetails.filter(
el => this.cartProducts.some(f => f.id === el.productID),
);
},
此功能提供产品ID 1和3的产品详细信息。 我想要的是一个新数组,它将cartProducts数组的数量属性添加到productDetails数组。
newArray: [
{
productID: 1,
productTitle: 'Product Title 1',
productPrice: 2000,
quantity:5
},
{
productID: 3,
productTitle: 'Product Title 3',
productPrice: 1000,
quantity:5
}
]
我希望我已经阐明了我的问题。我也在尝试使用地图javascript方法解决此问题,但无法正常工作。
此致
答案 0 :(得分:4)
使用地图和对象展开组合两个数组:
var newArray = cartProducts.map(cart => ({
...cart,
...productDetails.find(prod => prod.productID === cart.productID)
}));
答案 1 :(得分:4)
使用render
作为键,将productDetails
转换为Map(productDetailsMap
)。
用Array.map()
对productID
进行迭代,将cartProducts
从productDetailsMap
中获得当前乘积,然后将spreading合并到一个新对象中。
productID
答案 2 :(得分:3)
您可以在filter()
之后使用map()并将quantity
属性添加到每个项目。
const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }];
function cartItemDetails() {
return productDetails
.filter(el => cartProducts.some(f => f.productID === el.productID))
.map(item => ({
...item,
"quantity": cartProducts.find(f => f.productID === item.productID).quantity
}));
}
console.log(cartItemDetails());
或者您可以使用reduce()。
const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }];
function cartItemDetails() {
return productDetails.reduce((acc, curr) => {
let item = cartProducts.find(f => f.productID === curr.productID);
if (item) {
acc.push({ ...curr,
"quantity": item.quantity
});
}
return acc;
}, []);
}
console.log(cartItemDetails());
您还可以在map()
上使用cartProducts
。
const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }];
function cartItemDetails() {
return cartProducts.map(item => ({
...productDetails.find(f => f.productID === item.productID),
...item
}));
}
console.log(cartItemDetails());
答案 3 :(得分:3)
您可以尝试类似的操作:
cartItemDetails() {
return this.cartProducts.map(cp => {
let prod = this.productDetails.find(pd => pd.productID === cp.productID)
return {...cp, ...prod}
})
}
希望这会有所帮助:)
答案 4 :(得分:3)
只要productID匹配,就可以使用Object.assign()
方法将属性值对从productDetails复制到cartProducts:
let productDetails = [
{
productID: 1,
productTitle: 'Product Title 1',
productPrice: 2000
},
{
productID: 2,
productTitle: 'Product Title 2',
productPrice: 5000
},
{
productID: 3,
productTitle: 'Product Title 3',
productPrice: 1000
},
{
productID: 4,
productTitle: 'Product Title 4',
productPrice: 10000
}
];
let cartProducts = [
{
productID: 1,
quantity: 5,
},
{
productID: 3,
quantity: 2,
}
];
cartProducts.map(cart => Object.assign(cart, productDetails.find(product => product.productID === cart.productID)) )
console.log(cartProducts)
答案 5 :(得分:3)
cartProducts.map(cartProduct => {
return {
...productDetails.find(product => product.productID === cartProduct.productID),
"quantity": cartProduct.quantity
}
});
如果需要,您可以做一些空检查。
答案 6 :(得分:3)
这就是在这里弄乱您的代码的原因:
cartItemDetails() {
return this.productDetails.filter(
el => this.cartProducts.some(f => f.id === el.productID),
);
},
f
是cartProducts
项,没有属性id
。
我认为您的意思是f.productID
。
现在这是一种使用quantity
函数添加map
属性的方法:
this.productDetails = cartItemDetails().map((element) => {
for (let e of this.cartProducts) {
if (e.productID === element.productID) return {...element, quantity: e.quantity}
}
})