4

I have an array of objects which each may have collection of transactions I need to extract two values of the array

  • sum value of all objects
  • sum amount of all transactions
[
    {
        "id": "1",
        "value": 2343,
        "transactions": [
            {
                "id": 88,
                "amount": 34,
            },
            {
                "id": 89,
                "amount": 111,
            }
        ]
    },
    {
        "id": "2",
        "value": 345,
        "transactions": [
            {
                "id": 90,
                "amount": 44,
            },
            {
                "id": 91,
                "amount": 112,
            }
        ]
    }
]

The first one I achieve by

objects.reduce((acc, transaction) => acc + transaction.value, 0);

But the second one is too difficult for me to achieve; do I loop and reduce each object?

2 Answers 2

6

With lodash you can use _.sumBy() to get the value, and nesting _.sumBy() calls to get the transactions amount:

const data = [{"id":"1","value":2343,"transactions":[{"id":88,"amount":34},{"id":89,"amount":111}]},{"id":"2","value":345,"transactions":[{"id":90,"amount":44},{"id":91,"amount":112}]}];

const value = _.sumBy(data, 'value');

const transactions = _.sumBy(data, ({ transactions }) => _.sumBy(transactions, 'amount'));

console.log('value: ', value);
console.log('transactions: ', transactions);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Without lodash, you can use the same logic with Array#reduce:

const data = [{"id":"1","value":2343,"transactions":[{"id":88,"amount":34},{"id":89,"amount":111}]},{"id":"2","value":345,"transactions":[{"id":90,"amount":44},{"id":91,"amount":112}]}];

const value = data.reduce((acc, { value }) => acc + value, 0);

const transactions = data.reduce((acc, { transactions }) =>   
  transactions.reduce((acc, { amount }) => acc + amount, 0)
, 0);

console.log('value: ', value);
console.log('transactions: ', transactions);

Sign up to request clarification or add additional context in comments.

Comments

1

This may be old fashioned, but I like .forEach() loops for a simple problem like this. They are straightforward and easy to understand.

let objects = [
    {
        "id": "1",
        "value": 2343,
        "transactions": [
            { "id": 88, "amount": 34, },
            { "id": 89, "amount": 111, }
        ]
    },
    {
        "id": "2",
        "value": 345,
        "transactions": [
            { "id": 90, "amount": 44, },
            { "id": 91, "amount": 112, }
        ]
    }
];

let totalValue = 0;
let totalTransactionAmount = 0;

objects.forEach( function( object ) {
    totalValue += object.value;
    object.transactions.forEach( function( transaction ) {
        totalTransactionAmount += transaction.amount;
    });
});

console.log( totalValue, totalTransactionAmount );

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.