In my opinion, the common point here is:
Assume we need to build a "sum" method, it should:
sum(coolObject) // => 1 + 2 + 3 + 4 + 5 + 6
sum(coolObject.one) // => 1 + 2
Even deeper, for example with:
coolObject.four = {
number1: 8,
number2: {
number21: 7,
number22: {
number221: 9
}
}
}
sum(coolObject.four) // => 8 + 7 + 9
If you agree with my assumption, what you need may be a single method call that can sum all the values come from any level of the object property. I would like to recommend you to refer my solution as bellow:
let isArray = Array.isArray;
let makeArray = x => Array.from(Object.values(x));
let flatten = (arr) => {
return arr.reduce((prev, curr) => {
return prev.concat(isArray(curr) ? flatten(curr) : curr);
}, []);
};
let decay = (ob) => {
let arr = makeArray(ob);
if (arr.length > 0) {
return arr.map((item) => {
return decay(item);
});
}
return [ob];
};
let sum = (ob) => {
let arr = flatten(decay(ob));
return arr.reduce((prev, curr) => {
return prev + curr;
}, 0);
};
With a sum method like that, you can test:
const coolObject = {
one: {
number1: 1,
number2: 2
},
two: {
number1: 3,
number2: 4
},
three: {
number1: 5,
number2: 6
},
four: {
number1: 8,
number2: {
number21: 7,
number22: {
number221: 9
}
}
}
}
console.log(`sum(coolObject.one):`, sum(coolObject.one));
console.log(`sum(coolObject.two):`, sum(coolObject.two));
console.log(`sum(coolObject.three):`, sum(coolObject.three));
console.log(`sum(coolObject.four):`, sum(coolObject.four));
console.log(`sum(coolObject.four.number1):`, sum(coolObject.four.number1));
console.log(`sum(coolObject.four.number2):`, sum(coolObject.four.number2));
console.log(`sum(coolObject):`, sum(coolObject));