Сумма значений ключей во вложенных объектах
Не могу придумать как качественно решить следующую задачу: есть объект, в него вложены еще объекты или массивы объектов. Нужно посчитать сумму всех значений определенного ключа. Не известно сколько уровней вложения.
Пример объекта (testObject):
{
"title": "1",
"amount": 4,
"secondObject": {"title": "2", "price": 123, "amount": 8},
"array": [
0: {"title": "2", "amount": 2},
1: {"title": "2", "amount": 3}
]
}
В этом примере мне нужно посчитать сумму всех значений ключа amount.
sumField(testObject, "amount"); // 17
Помогите придумать элегантное решение данной задачи. Без проблем пойму ES6 код, он даже в приоритете. Не против решения на любом другом языке или псевдокоде.
Ответы (2 шт):
Автор решения: St2211
→ Ссылка
Спасибо за ответы, вот что у меня по итогу получилось. Если у кого есть варианты лучше, пожалуйста напишите.
function sumField(obj, key) {
let fieldIterator = JSON.stringify(obj).matchAll('(?<="' + key + '":)[0-9]*');
let it = fieldIterator.next(), result = 0;
while (!it.done) {
result += it.value[0] - 0;
it = fieldIterator.next();
}
return result;
}
let testObject = {
"amount": 4,
"title": "1",
"object1": {"title": "2", "price": 123, "amount": 4},
"object2": {"amount": 4, "title": "2", "price": 123},
"array": [
{"amount": 2, "title": "2"},
{"title": "2", "amount": 3}
]
};
console.log(sumField(testObject, "amount"));
Автор решения: PHPWork
→ Ссылка
Один из вариантов :
function sumNestedObjectValues(obj) {
let sum = 0;
for (let key in obj) {
if (typeof obj[key] === "object") {
sum += sumNestedObjectValues(obj[key]);
} else if (typeof obj[key] === "number") {
sum += obj[key];
}
}
return sum;
}
let obj = {
a: 1,
b: {
c: 2,
d: {
e: 3
}
}
};
let summ = sumNestedObjectValues(obj);
console.log(summ); // Return 6