JavaScript 对对象数组子集合中的属性求和

das*_*orp 3 javascript lodash

我有一个对象数组,每个对象都可能有交易集合,我需要提取数组的两个值

  • 所有对象的总和
  • 所有交易的总和
[
    {
        "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,
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我实现的第一个

objects.reduce((acc, transaction) => acc + transaction.value, 0);
Run Code Online (Sandbox Code Playgroud)

但是第二个对我来说太难了;循环并减少每个对象?

Ori*_*ori 6

使用 lodash,您可以使用_.sumBy()获取值,并嵌套_.sumBy()调用以获取交易金额:

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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果没有 lodash,你可以对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);
Run Code Online (Sandbox Code Playgroud)