Найти сумму четных элементов объекта
Помогите написать функцию, которая получает сумму всех четных элементов в объекте.
let data = {
country: 2,
size: [{
country: 4,
size: [{
country: 2,
size: [{
country: 1,
}]
}]
},
{
country: 3,
size: [{
country: 6,
size: [{
country: 5,
}]
}]
}
]
} ;
Мое решение:
function recursion(param, sum) {
if (typeof param.size !== 'undefined') {
sum = param.country
console.log(param.size)
return recursion(param.size,0)
}
return sum + param.country;
}
console.log(recursion(data, 0))
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
typeof param.size !== 'undefined' - здесь вы не учитываете, что каждый объект, кроме внешнего, вложен в дополнительный массив. Т.е. нужно отдельно проверять элементы массвов param[0].size, param[1].size..., а это можно сделать, например, в цикле:
let data = getData();
console.log(recursion(data, 0));
function recursion(obj, sum) {
if (!obj instanceof Object) return sum;
// Если не массив, и не объект
if (obj instanceof Array) {
// Если наткнулись на массив,
// к сумме прибавить результат вызова для каждого вложенного в него объекта
let arr = obj;
arr.forEach(innerObj => sum += recursion(innerObj, 0))
}
if (obj.country % 2 == 0) sum += obj.country;
// Наличие массива уже учтено выше.
// Если дошло сюда, значит находимся в объекте, у которого может быть size.
return obj.size ? sum + recursion(obj.size, 0) : sum;
}
/***/
function getData() {
return {
country: 2,
size: [{
country: 4,
size: [{
country: 2,
size: [{
country: 1,
}]
}]
},
{
country: 3,
size: [{
country: 6,
size: [{
country: 5,
}]
}]
}
]
};
}
Но пока массив не очень большой, можно не заморачиваться с рекурсией, потому что:
let data = getData();
console.log( sum(data) );
function sum(obj) {
let even = JSON.stringify(obj).match(/country":\d*[02468]/g);
// \d*[02468] — \d любая цифра (digit), * от 0 до "много" раз подряд,
// и чтобы число заканчивалось на 0, 2, 4, 6 или 8.
if (!even) return 0;
return even.map(str => +str.match(/\d+/)[0]).reduce((a,b) => a + b);
// Плюсик перед str - превращает полученную строку в число.
}
/***/
function getData() {
return {
country: 2,
size: [{
country: 4,
size: [{
country: 2,
size: [{
country: 1,
}]
}]
},
{
country: 3,
size: [{
country: 6,
size: [{
country: 5,
}]
}]
}
]
};
}