Запишите все элементы объекта массив

Дан такой объект:

let data = {
    2018: {
        11: {
            29: [1, 2, 3],
            30: [4, 5],
        },
        12: {
            30: [6, 7],
            31: [8, 9],
        },
    },
    2019: {
        12: {
            29: [10, 11],
            30: [12, 13],
            31: [14, 15],
        }
    },
}

Запишите все элементы этого объекта в какой-нибудь массив, вот так:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Я наваял следующее:

let res = [];

      for (const elem in data) { // создаю элемент
        sum = (elem) =>
          elem instanceof Object // проверка является ли элемент объектом
            ? Object.values(elem).reduce((acc, n) =>res.concat(acc + sum(n)), 0) // здесь я использую свой опыт по сложению значений массивов, находящихся внутри объектов и чуточку фантазии)
            : res.push(elem);
      }
      console.log(sum(data));

И все бы ничего, но результат в консоли такой: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, '1,2,3,4,5,6,7,8,9,01,2,3,4,5,6,7,8,9,1,2,3,4,5,01,…12,13,14,15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1415']. И вот я не могу понять зачем он добавляет строку)

если же функцию пишу так:

        sum = (elem) =>
          elem instanceof Object
            ? Object.values(elem).reduce((acc, n) =>res.concat(sum(n)), 0)
            : res.push(elem);

, то он четырежды выводит числа. Сейчас продолжаю грызть иностранный stack, mdn и учебник по js. Если придёт гениальная мысль, то поправлю)


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

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

Запишите все элементы объекта массив

Предложу использование рекурсии для решения этой задачки...

const data = {
    2018: {
        11: {
            29: [1, 2, 3],
            30: [4, 5],
        },
        12: {
            30: [6, 7],
            31: [8, 9],
        },
    },
    2019: {
        12: {
            29: [10, 11],
            30: [12, 13],
            31: [14, 15],
        }
    },
}
console.log(test(data))
//
function test(obj) {
    return Object.values(obj).reduce((a, v) => {
        a.push(...(Array.isArray(v) ? v : test(v)))
        return a
    }, [])
}

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

Решил, поправив свой код. Кривенько, но решил)

  
 let data = {
2018: {
    11: {
        29: [1, 2, 3],
        30: [4, 5],
    },
    12: {
        30: [6, 7],
        31: [8, 9],
    },
},
2019: {
    12: {
        29: [10, 11],
        30: [12, 13],
        31: [14, 15],
    }
},
}
let res =[]
const sum = (val) =>
val instanceof Object
? Object.values(val).reduce((acc, n) => acc.concat(sum(n)), [])
: val;
console.log(sum(data));

→ Ссылка