Как преобразовать объект в массив, чтобы создать несколько собственных, если значение объекта является массивом

У меня есть массив объектов, которые имеют одинаковую структуру, за исключением того, что некоторые значения имеют массивы в качестве типа, означающего, что он имеет несколько значений. Мне нужно создать новый объект в этом массиве на основе количества элементов в массиве.

const arrayOfObjects = [
  {
      "Serial Number": "83675327350061093222581609820467",
      "Part Number": "LJ98-10C779-AA",
      "Cell Count": "32",
      "Length": "6"
  },
  {
      "Serial Number": "19584757350061093222581606739916",
      "Type": "Extended Range",
      "Part Number": "SW23",
      "Length": "50"
  },
  {
      "Serial Number": [
          "90946117350061093222581604839920",
          "77362117350061093222581604891733",
          "77362117350061093222581604891734",
      ],
      "Part Number": [
          "TR40-60C779-AA",
          "ST41-60C780-AA",
          "ZT41-60C780-AA",
      ],
      "Cell Count": [
          "28",
          "27",
          "26"
      ],
      "Length": [
          "10",
          "11",
          "12"
      ]
  }
]

Ниже показано, как я хочу преобразовать его.

const transformedArray = [
  {
      "Serial Number": "83675327350061093222581609820467",
      "Part Number": "LJ98-10C779-AA",
      "Cell Count": "32",
      "Length": "6"
  },
  {
      "Serial Number": "19584757350061093222581606739916",
      "Type": "Extended Range",
      "Part Number": "SW23",
      "Length": "50"
  },
   {
      "Serial Number": "90946117350061093222581604839920",
      "Part Number": "TR40-60C779-AA",
       "Cell Count": "28",
      "Length": "10"
  },
  {
      "Serial Number": "77362117350061093222581604891733",
      "Part Number": "ST41-60C780-AA",
      "Cell Count": "27",
      "Length": "11"
  },
  {
    "Serial Number": "77362117350061093222581604891734",
    "Part Number": "ZT41-60C780-AA",
    "Cell Count": "26",
    "Length": "12"
  },
]

Я попытался решить эту проблему с помощью приведенного ниже кода, пожалуйста, помогите завершить:

let newItemsArray = [];

arrayOfObjects.map((item,index) => {
    return Object.entries(item).map(([key,value]) => {
        if (Array.isArray(value)){
            value.forEach(x => {
                newItemsArray.push({[key]:x})    
            })
            
        }
    })
})
Поведение ключевого слова "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
0
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете проверить, содержат ли записи объекта массив, и уменьшить записи или взять объект для сопоставления.

const
    data = [{ "Serial Number": "83675327350061093222581609820467", "Part Number": "LJ98-10C779-AA", "Cell Count": "32", "Length": "6" }, { "Serial Number": "19584757350061093222581606739916", "Type": "Extended Range", "Part Number": "SW23", "Length": "50" }, { "Serial Number": [ "90946117350061093222581604839920", "77362117350061093222581604891733", "77362117350061093222581604891734"], "Part Number": [ "TR40-60C779-AA", "ST41-60C780-AA", "ZT41-60C780-AA"], "Cell Count": [ "28", "27", "26"], "Length": [ "10", "11", "12"] }],
    result = data.flatMap(object => {
        const entries = Object.entries(object);
        return Array.isArray(entries[0][1])
            ? entries.reduce((r, [k, a]) => a.map((v, i) => ({ ...r[i], [k]: v })), [])
            : object;
    });

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Без flatMap

const
    data = [{ "Serial Number": "83675327350061093222581609820467", "Part Number": "LJ98-10C779-AA", "Cell Count": "32", "Length": "6" }, { "Serial Number": "19584757350061093222581606739916", "Type": "Extended Range", "Part Number": "SW23", "Length": "50" }, { "Serial Number": [ "90946117350061093222581604839920", "77362117350061093222581604891733", "77362117350061093222581604891734"], "Part Number": [ "TR40-60C779-AA", "ST41-60C780-AA", "ZT41-60C780-AA"], "Cell Count": [ "28", "27", "26"], "Length": [ "10", "11", "12"] }],
    result = data.reduce((array, object) => {
        const entries = Object.entries(object);
        if (Array.isArray(entries[0][1])) return [
            ...array,
            entries.reduce((r, [k, a]) => a.map((v, i) => ({ ...r[i], [k]: v })), [])
        ];
        return [...array, object];
    }, []);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

не могли бы вы написать решение, которое не использует .flatMap()? У меня проблема с компилятором машинописного текста, из-за которой я не могу использовать ваше решение :(

Jim41Mavs 05.04.2022 22:45

Вы можете использовать Array#reduce и Object.keys с методами Array#map следующим образом:

const input = [
  {
      "Serial Number": "83675327350061093222581609820467",
      "Part Number": "LJ98-10C779-AA",
      "Cell Count": "32",
      "Length": "6"
  },
  {
      "Serial Number": "19584757350061093222581606739916",
      "Type": "Extended Range",
      "Part Number": "SW23",
      "Length": "50"
  },
  {
      "Serial Number": [
          "90946117350061093222581604839920",
          "77362117350061093222581604891733",
          "77362117350061093222581604891734",
      ],
      "Part Number": [
          "TR40-60C779-AA",
          "ST41-60C780-AA",
          "ZT41-60C780-AA",
      ],
      "Cell Count": [
          "28",
          "27",
          "26"
      ],
      "Length": [
          "10",
          "11",
          "12"
      ]
  }
];

const output = input.reduce((prev, {Length, ...rest}) => 
    Array.isArray(Length) ? 
    prev.concat( Length.map((l,i) => Object.fromEntries( Object.keys(rest).map(k => [k,rest[k][i]]).concat( [["Length",l]] ))) ) :
    prev.concat( {...rest,Length} ), []
);

console.info( output );

Без Object.fromEntries

const input = [
  {
      "Serial Number": "83675327350061093222581609820467",
      "Part Number": "LJ98-10C779-AA",
      "Cell Count": "32",
      "Length": "6"
  },
  {
      "Serial Number": "19584757350061093222581606739916",
      "Type": "Extended Range",
      "Part Number": "SW23",
      "Length": "50"
  },
  {
      "Serial Number": [
          "90946117350061093222581604839920",
          "77362117350061093222581604891733",
          "77362117350061093222581604891734",
      ],
      "Part Number": [
          "TR40-60C779-AA",
          "ST41-60C780-AA",
          "ZT41-60C780-AA",
      ],
      "Cell Count": [
          "28",
          "27",
          "26"
      ],
      "Length": [
          "10",
          "11",
          "12"
      ]
  }
];

const output = input.reduce((prev, {Length, ...rest}) => 
    Array.isArray(Length) ? 
    prev.concat( 
        Length.map((l,i) => 
        Object.keys(rest).map(k => ({[k]:rest[k][i]})).concat( {"Length":l} )
        .reduce((p,c) => ({...p,...c}),{}) ) 
    )  :
    prev.concat( {...rest,Length} ), []
);

console.info( output );

Спасибо @PeterKA, у вас есть решение, в котором не используется Object.fromEntries()? Я не могу использовать его, так как у меня проблема с компилятором машинописного текста, которая не позволяет мне использовать его Object.fromEntries()

Jim41Mavs 06.04.2022 00:10

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