避免在数据转换期间重复代码

时间:2019-04-25 07:12:29

标签: javascript javascript-objects

我有一些伪数据,如下所示:

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
}

2 个答案:

答案 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);