Как объединить свойства объекта в родственных свойствах

У меня есть массив таких объектов, которые я прочитал и проанализировал из CSV-файла.

const csvDataObjects = [
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 151 QC',
      'Extended Range',
      '4P94-Q051',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: ['8367532735006109322258160 50', 'LJ98-10C779-A51', '32'],
    assetSeparator: 'assetSeparator',
  },
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 152 QC',
      'Extended Range',
      '4P94-Q052',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: [
      ['8367532735006109322258160 51', 'LJ98-10C779-A52', '28'],
      ['8367532735006109322258161 52', 'LJ98-10C779-A53', '27'],
    ],
    assetSeparator: 'assetSeparator',
  },
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 153 QC',
      'Extended Range',
      '4P94-Q053',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: [
      ['8367532735006109322258162 53', 'LJ98-10C779-A54', '28'],
      ['8367532735006109322258163 54', 'LJ98-10C779-A55', '27'],
      ['8367532735006109322258163 56', 'LJ98-10C779-A56', '27'],
    ],
  },
];

Что я хочу сделать, так это объединить все связанные свойства родственных объектов, которые будут объединены вместе. Итак, я хочу, чтобы сведения о батарее находились в объекте батареи, а сведения о модулях — в объекте модулей. Таким образом, окончательный вывод должен выглядеть так:

const desiredCsvDataObjects = [
  {
    Battery: {
      batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
      batteryDetailsVal: [
        'HJ3CA19347410218LJ98 151 QC',
        'Extended Range',
        '4P94-Q051',
      ],
    },
    Modules: {
      moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
      moduleDetailsVal: [
        '8367532735006109322258160 50',
        'LJ98-10C779-A51',
        '32',
      ],
    },
  },
  {
    Battery: {
      batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
      batteryDetailsVal: [
        'HJ3CA19347410218LJ98 152 QC',
        'Extended Range',
        '4P94-Q052',
      ],
    },
    Modules: {
      moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
      moduleDetailsVal: [
        ['8367532735006109322258160 51', 'LJ98-10C779-A52', '28'],
        ['8367532735006109322258161 52', 'LJ98-10C779-A53', '27'],
      ],
    },
  },
  {
    Battery: {
      batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
      batteryDetailsVal: [
        'HJ3CA19347410218LJ98 153 QC',
        'Extended Range',
        '4P94-Q053',
      ],
    },
    Modules: {
      moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
      moduleDetailsVal: [
        ['8367532735006109322258162 53', 'LJ98-10C779-A54', '28'],
        ['8367532735006109322258163 54', 'LJ98-10C779-A55', '27'],
        ['8367532735006109322258163 56', 'LJ98-10C779-A56', '27'],
      ],
    },
  },
];

Вот мой уродливый код, пытающийся сделать то, что я хочу

let newEmptyArr = [];
let emptyObj = {};

csvDataObjects.forEach(item => {
  Object.keys(item).forEach(x => {
    if (x === 'Battery') {
      emptyObj[x] = {};
    }
    if (x === 'batteryDetailsKey') {
      emptyObj.Battery = {
        batteryDetailsKey: item[x],
      };
    }
    if (x === 'batteryDetailsVal') {
      emptyObj.Battery = {
        batteryDetailsVal: item[x],
      };
    }
    if (x === 'Modules') {
      emptyObj[x] = {};
    }
    if (x === 'moduleDetailsKey') {
      emptyObj.Modules = {
        moduleDetailsKey: item[x],
      };
    }
    if (x === 'moduleDetailsVal') {
      emptyObj.Modules = {
        moduleDetailsVal: item[x],
      };
    }
  });
  newEmptyArr.push(emptyObj);
});

Пожалуйста, помогите мне исправить мой уродливый код или помогите мне написать хороший красивый :)

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете использовать map, чтобы получить новый массив из старого массива следующим образом:

const desiredCsvDataObjects  = csvDataObjects.map((item) => {
  const { batteryDetailsKey, batteryDetailsVal, moduleDetailsKey, moduleDetailsVal } = item;
  return {
    Battery: { batteryDetailsKey, batteryDetailsVal },
    Modules: { moduleDetailsKey, moduleDetailsVal },
  };
});

Я надеюсь, что это полезно!

Вау, так красиво и элегантно. Определение декларативного программирования! Большое спасибо @Prayx

Jim41Mavs 23.03.2022 03:55

Используйте метод Array#map():

const result = csvDataObjects.map(
    ({ 
        batteryDetailsKey, 
        batteryDetailsVal, 
        moduleDetailsKey, 
        moduleDetailsVal
    }) => 
    ({
        Battery: { batteryDetailsKey, batteryDetailsVal },
        Modules: { moduleDetailsKey, moduleDetailsVal }
    })
);

ДЕМО

const data = [
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 151 QC',
      'Extended Range',
      '4P94-Q051',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: ['8367532735006109322258160 50', 'LJ98-10C779-A51', '32'],
    assetSeparator: 'assetSeparator',
  },
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 152 QC',
      'Extended Range',
      '4P94-Q052',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: [
      ['8367532735006109322258160 51', 'LJ98-10C779-A52', '28'],
      ['8367532735006109322258161 52', 'LJ98-10C779-A53', '27'],
    ],
    assetSeparator: 'assetSeparator',
  },
  {
    Battery: 'Battery',
    batteryDetailsKey: ['Serial Number', 'Type', 'Part Number'],
    batteryDetailsVal: [
      'HJ3CA19347410218LJ98 153 QC',
      'Extended Range',
      '4P94-Q053',
    ],
    Modules: 'Modules',
    moduleDetailsKey: ['Serial Number', 'Part Number', 'Cell Count'],
    moduleDetailsVal: [
      ['8367532735006109322258162 53', 'LJ98-10C779-A54', '28'],
      ['8367532735006109322258163 54', 'LJ98-10C779-A55', '27'],
      ['8367532735006109322258163 56', 'LJ98-10C779-A56', '27'],
    ],
  },
];

const result = data.map(({batteryDetailsKey,batteryDetailsVal,moduleDetailsKey,moduleDetailsVal}) => 
    ({Battery:{batteryDetailsKey,batteryDetailsVal},Modules:{moduleDetailsKey,moduleDetailsVal}})
);

console.info( result );

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