Запишите все элементы объекта массив
Дан такой объект:
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 шт):
Запишите все элементы объекта массив
Предложу использование рекурсии для решения этой задачки...
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
}, [])
}
Решил, поправив свой код. Кривенько, но решил)
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));