Избегайте повторения кода во время преобразования данных

У меня есть некоторые фиктивные данные, как показано ниже:

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
}

Можем ли мы изменить структуру данных?

Sagi Rika 25.04.2019 09:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из вариантов — .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);

Другие вопросы по теме