#javascript #arrays #json #reduce #nested-object
Вопрос:
мне нужно суммировать всю «цену» внутри атрибута массива продуктов на основе идентификатора внутри атрибута «fromSuppliers». Каков был бы лучший способ сделать это? Я пробовал использовать map и reduce, но мне это не удалось. Любая помощь будет оценена по достоинству.
результат, ожидаемый для этого примера:
[
{ id: 1, totalPrice: 19,84 }
{ id: 2, totalPrice: 9.84 }
]
объект:
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'
},
}
Ответ №1:
Вы можете использовать Object.values()
, чтобы получить массив ваших items
. Затем мы использовали бы Array.reduce()
для создания объекта карты, включенного id
. Мы бы еще раз использовали Object.values, чтобы превратить наш объект карты в массив.
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; }