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

let sum = 0;
let obj = {
  key1: {
    a: 1,
    b: 2,
    c: {
      d: 3,
      e: 4,
    },
    f: 5,
  },
  key2: {
    g: 6,
    h: 7,
  },
};

for (key in obj) {
  let subObj = obj[key]
  for (key in subObj) {
    let keySubObj = subObj[key];
    for (key in keySubObj) {
      let keyDeepObject = keySubObj[key]
      sum += keyDeepObject
    }
  }
}

console.log(sum);


Ответы (3 шт):

Автор решения: EzioMercer

Если хотите без рекурсии и точно знаете максимальную глубину вашего объекта, то можно так:

let sum = 0;
let obj = {
  key1: {
    a: 1,
    b: 2,
    c: {
      d: 3,
      e: 4,
    },
    f: 5,
  },
  key2: {
    g: 6,
    h: 7,
  },
};

for (const key in obj) {
  if (typeof obj[key] === 'number') {
    sum += obj[key];
    continue;
  }
  
  const subObj = obj[key]
  
  for (const key in subObj) {
    if (typeof subObj[key] === 'number') {
      sum += subObj[key];
      continue;
    }
    
    const keySubObj = subObj[key];
    
    for (const key in keySubObj) {
      sum += keySubObj[key]
    }
  }
}

console.log(sum);

→ Ссылка
Автор решения: Neverm1ndo

Вариант с рекурсией

let sum = 0;
let obj = {
  key1: {
    a: 1,
    b: 2,
    c: {
      d: 3,
      e: 4,
    },
    f: 5,
  },
  key2: {
    g: 6,
    h: 7,
  },
};

function sumOfValues(obj) {
  return Object.values(obj).reduce(function(sum, current) {
    if (typeof current !== 'number') return sumOfValues(current) + sum;
    return sum + current;
  }, 0);
}

console.log(sumOfValues(obj)); //28
→ Ссылка
Автор решения: Игорь Трубников
let sum = 0;
let obj = {
    key1: {
        a: 1, 
        b: 2, 
        c: {
            d: 3,
            e: 4,
            }, 
        f: 5,
    },
    key2: {
        g: 6, 
        h: 7,
    },
};




for(key in obj) {
    let subObj = obj[key]
    for(key in subObj) {
        let keySubObj = subObj[key];
        for(key in keySubObj) {
            let keyDeepObject = keySubObj[key]
            sum += keyDeepObject
        }
    if(parseInt(keySubObj)) {
        sum += keySubObj
        }    
    }
}
console.log(sum)
→ Ссылка