Сумма значений ключей во вложенных объектах

Не могу придумать как качественно решить следующую задачу: есть объект, в него вложены еще объекты или массивы объектов. Нужно посчитать сумму всех значений определенного ключа. Не известно сколько уровней вложения.

Пример объекта (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

→ Ссылка