Сумма во вложенном объекте для каждого идентификатора

#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; }