我需要根据id对product array属性中的所有'price'求和在' fromproviders '属性中。最好的方法是什么?我尝试过map和reduce,但没有成功。如有任何帮助,不胜感激。
本例期望的输出:
[
{ id: 1, totalPrice: 19,84 }
{ id: 2, totalPrice: 9.84 }
]
obj:
const Jsonresult = {
items: {
'**9089**': {
createdAt: '2021-02-11T17:25:22.960-03:00',
product: [{
fromSuppliers: {
productSupplier: {
stock: 102,
promoPrice: 16,
},
'**id**': 2
}
}],
total: 9.84,
quantity: 1,
price: '**9.84**',
updatedAt: '2021-02-11T17:25:22.960-03:00'
},
'**9090**': {
createdAt: '2021-02-11T17:25:22.960-03:00',
product: [{
fromSuppliers: {
productSupplier: {
stock: 102,
promoPrice: 7,
},
'**id**': 1
}
}],
total: 9.84,
quantity: 1,
'**price**': 9.84,
updatedAt: '2021-02-11T17:25:22.960-03:00'
},
'**9091**': {
createdAt: '2021-02-11T17:25:22.960-03:00',
product: [{
fromSuppliers: {
productSupplier: {
stock: 102,
promoPrice: 7,
},
'**id**': 1
}
}],
total: 9.84,
quantity: 1,
'**price**': 10,
updatedAt: '2021-02-11T17:25:22.960-03:00'
},
}
您可以使用Object.values()
来获得items
的数组。然后我们将使用Array.reduce()
来创建一个映射对象,键在id
上。我们会使用Object。再次赋值,将map对象转换为数组。
const Jsonresult = { items: { '9089': { createdAt: '2021-02-11T17:25:22.960-03:00', product: [{ fromSuppliers: { productSupplier: { stock: 102, promoPrice: 16, }, id: 2 } }], total: 9.84, quantity: 1, price: 9.84, updatedAt: '2021-02-11T17:25:22.960-03:00' }, '9090': { createdAt: '2021-02-11T17:25:22.960-03:00', product: [{ fromSuppliers: { productSupplier: { stock: 102, promoPrice: 7, }, id: 1 } }], total: 9.84, quantity: 1, price: 9.84, updatedAt: '2021-02-11T17:25:22.960-03:00' }, '9091': { createdAt: '2021-02-11T17:25:22.960-03:00', product: [{ fromSuppliers: { productSupplier: { stock: 102, promoPrice: 7, }, id: 1 } }], total: 9.84, quantity: 1, price: 10, updatedAt: '2021-02-11T17:25:22.960-03:00' }, } };
const items = Object.values(Jsonresult.items);
const result = Object.values(items.reduce((acc, { price, product: [ { fromSuppliers: { id }} ]}) => {
if (!acc[id]) acc[id] = { id, price: 0 };
acc[id].price += price;
return acc;
}, {}));
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }