我有一些伪数据,如下所示:
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
}
答案 0 :(得分:5)
一个选项是.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.log(newData);
答案 1 :(得分:0)
关于代码质量,一个好的方法是将逻辑提取到具有有意义名称的函数中。代码有增长的趋势,因此将来将逻辑提取到位(函数)中将具有许多优势。在我看来,较短的语法/逻辑并不总是可以转换为高质量的代码,在许多情况下,比起简短而复杂的语法,更容易阅读/理解的代码甚至更长的时间更可取。
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.log(convertedMonthData);