У меня есть некоторые фиктивные данные, как показано ниже:
data: {
first: {
date_2019_01: 10,
date_2019_02: 15,
....
},
second: {
date_2019_01: 30,
date_2019_02: 35,
....
}
}
Я должен преобразовать эти исходные данные в следующий формат, где дата в качестве ключа должна быть преобразована в месяц, а ее значение - в рост.
first: [
{
month: 1,
growth: 10
},
{
month: 2,
growth: 15
},
...
],
second: [
{
month: 1,
growth: 30
},
{
}
]
В моем решении я получаю ключи и разделяю их, чтобы получить желаемый месяц, который помещается в новый массив. Но здесь мои коды повторяются. Я изучаю качество кода, которое также включает концепцию DRY.
Пожалуйста, помогите мне написать этот фрагмент кода в лучшем формате.
Спасибо.
let first = data["first"];
let firstMonth = [];
Object.keys(first).map(function(key) {
firstMonth.push({
month: key.split('_')[2],
growth: first[key]
});
});
let second = data["second"];
let secondMonth = [];
Object.keys(second).map(function(key) {
secondMonth.push({
month: key.split('_')[2],
growth: second[key]
});
});
let finalData = {
first: firstMonth,
second: secondMonth
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Один из вариантов — .map внутри .reduce. Вы можете использовать Object.entries вместо Object.keys для одновременного получения как ключей, так и значений, что немного сократит количество необходимого синтаксиса:
const data = {
first: {
date_2019_01: 10,
date_2019_02: 15,
},
second: {
date_2019_01: 30,
date_2019_02: 35,
}
};
const newData = Object.entries(data).reduce((a, [key, obj]) => {
a[key] = Object.entries(obj).map(([key, growth]) => ({
month: Number(key.slice(10)),
growth
}));
return a;
}, {});
console.info(newData);Когда дело доходит до качества кода, хороший способ — извлекать логику в функции с осмысленными именами. Код имеет тенденцию к росту, поэтому извлечение логики в биты (функции) будет иметь много преимуществ в будущем. На мой взгляд, более короткий синтаксис/логика не всегда приводит к коду хорошего качества, и во многих случаях легко читаемый/понимаемый код, даже немного более длинный, предпочтительнее короткого и сложного синтаксиса.
const data = {
first: {
date_2019_01: 10,
date_2019_02: 15,
},
second: {
date_2019_01: 30,
date_2019_02: 35,
}
};
function convertMonthData(monthData, resultArr){
Object.keys(monthData).map(function(key) {
resultArr.push({
month: Number(key.slice(10)),
growth: monthData[key]
});
});
}
let convertedMonthData = {};
Object.keys(data).map(function(key) {
const monthData = data[key];
convertedMonthData[key] = [];
convertMonthData(monthData, convertedMonthData[key]);
});
console.info(convertedMonthData);
Можем ли мы изменить структуру данных?