Суммирование итогов для массива с глубиной - PullRequest
0 голосов
/ 04 декабря 2018

Я, конечно, пытался найти конкретный пример или пример, чтобы приблизить меня к ответу.Я пытаюсь получить сумму из множества глубинного массива объектов.

Моя структура данных выглядит следующим образом:

[
    {
        "values":[
            {
                "values":[
                    {
                        "value":{
                            "value":"51214.35"
                        },
                    }
                ],
            }
        ],
    },
    {
        "values":[
            {
                "values":[
                    {
                        "value":{
                            "value":"10632.00"
                        },
                    },
                    {
                        "value":{
                            "value":"15000.00"
                        },
                    }
                ],
            }
        ],
    }
]

Я хотел бы, чтобы они были свойством для каждого объекта, который имеет сумму всех значений свойств, которые находятся далее в глубине.

Например:

[
        {
            "total":"51214.35",
            "values":[
                {
                    "total":"51214.35",
                    "values":[
                        {
                            "total":"51214.35",
                            "value":{
                                "value":"51214.35"
                            },
                        }
                    ],
                }
            ],
        },
        {
            "total":"25632.00",
            "values":[
                {
                    "total" : "25632.00",
                    "values":[
                        {
                            "total": "10632.00",
                            "value":{
                                "value":"10632.00"
                            },
                        },
                        {
                            "total": "15000.00",
                            "value":{
                                "value":"15000.00"
                            },
                        }
                    ],
                }
            ],
        }
    ]

Я знаю, что рекурсия, вероятно, вступит в игру, так как есть неизвестная глубина ...

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

const values = [
    {
        "values":[
            {
                "values":[
                    {
                        "value":{
                            "value":"51214.35"
                        },
                    }
                ],
            }
        ],
    },
    {
        "values":[
            {
                "values":[
                    {
                        "value":{
                            "value":"10632.00"
                        },
                    },
                    {
                        "value":{
                            "value":"15000.00"
                        },
                    }
                ],
            }
        ],
    }
];


const total = values => values.reduce((t, i) => {
  const currentTotal = i.value ? t + parseFloat(i.value.value) : i.values ? t + total(i.values) : t;
  i.total = currentTotal;
  return currentTotal;
}, 0);

total(values);

console.log(values);
0 голосов
/ 04 декабря 2018

Попробуйте это:

function calcTotal(data) {
    if (Array.isArray(data)) data.map(calcTotal)
    let total = 0
    if (data.hasOwnProperty('values')) total = data.values.map(calcTotal).reduce((acc, v) => acc + v.total, 0)
    else if (data.hasOwnProperty('value')) total = parseFloat(data.value.value)
    return Object.assign(data, { total })
}(data)

РЕДАКТИРОВАТЬ: Похоже, кто-то был быстрее меня: -)

0 голосов
/ 04 декабря 2018

Вы можете создать функцию, которая принимает объект, и если у него есть value, установите его как свойство totals.Если он не суммирует общее количество вызовов одной и той же функции для каждого элемента в массиве values.

Вы должны быть осторожны с суммой, поскольку в качестве значений используются строки, а не числа, но в остальном это довольно простая рекурсия.

let arr = [{"values":[{"values":[{"value":{"value":"51214.35"},}],}],},{"values":[{"values":[{"value":{"value":"10632.00"},},{"value":{"value":"15000.00"},}],}],}]

function setTotals(obj){
    obj.totals = obj.hasOwnProperty('value')
        ? parseFloat(obj.value.value)
        : obj.values.reduce((sum, item) => sum + setTotals(item), 0)
    return obj.totals
}
arr.forEach(item => setTotals(item))
console.log(arr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...