Как превратить объекты в массиве с одинаковыми ключами в отдельный объект в том же массиве

У меня есть массив объектов с одинаковыми ключами, я хочу создать новый массив объектов, который создает новый объект, объединяющий уникальные объекты в один


const arrayOfObjects = [
{ 'Serial Number': '90946117350061093222581604839920' },
{ 'Serial Number': '77362117350061093222581604891733' },
{ 'Serial Number': '77362117350061093222581604891734' },
{ 'Part Number': 'TR40-60C779-AA' },
{ 'Part Number': 'ST41-60C780-AA' },
{ 'Part Number': 'QT41-60C780-AA' },
{ 'Cell Count': '28' },
{ 'Cell Count': '27' },
{ 'Cell Count': '29' },
{ 'Length': '10' },
{ 'Length': '11' },
{ 'Length': '11' },
]

Таким образом, это должно выглядеть так, как показано ниже.

const desiredArrayOfObjects = [
{ 
    'Serial Number': '90946117350061093222581604839920',
    'Part Number': 'TR40-60C779-AA',
    'Cell Count': '27',
    'Length': '10',
},
{ 
    'Serial Number': '77362117350061093222581604891733',
    'Part Number': 'ST41-60C780-AA',
    'Cell Count': '28',
    'Length': '11',
},
{ 
    'Serial Number': '77362117350061093222581604891734',
    'Part Number': 'QT41-60C780-AA',
    'Cell Count': '29',
    'Length': '12',
},

]

Я пробовал это с кодом ниже, но я явно не понимаю, помощь приветствуется и приветствуется.

let newArr = [];
arrayOfObjects.map((x,i) => {
    Object.entries(x).map(([key, value]) => {
        if (!newArr.length){
            
            if (Object.keys(newArr[i]).toString() === key){
                newArr.push({[key]: value})                   
            }

        }
    })
})

С моей точки зрения, невозможно построить desiredArrayOfObjects из arrayOfObjects, потому что между объектами в arrayOfObjects нет никакой связи. Я имею в виду, я не вижу, как связать эти объекты между собой.

Ele 05.04.2022 18:11

@Ele Я думаю, это основано на заказе. Первый серийный номер, первый номер детали, первое количество ячеек и первая длина идут вместе.

user1599011 05.04.2022 18:13
if (!newArr.length){if (Object.keys(newArr[i]).toString() === key){newArr не имеет записей, так как же вы ожидаете установить newArr[i] в строку?
user1599011 05.04.2022 18:16

@ user1599011 нет, это неправда. Смотрите Length=12

Ele 05.04.2022 18:18

@Эле, как, когда мы только что проверили if (!newArr.length){? Это не ключ Length, это длина массива.

user1599011 05.04.2022 18:21

@user1599011 user1599011 Я говорю о массиве desiredArrayOfObjects (вывод).

Ele 05.04.2022 18:24

@ele, я вижу. Я думаю, что это, вероятно, опечатка. Но определенно затрудняет понимание.

user1599011 05.04.2022 18:35
Поведение ключевого слова "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
7
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, будет лучше, если вы сначала разделите их, а потом соберете обратно.

const arrayOfObjects = [
{ 'Serial Number': '90946117350061093222581604839920' },
{ 'Serial Number': '77362117350061093222581604891733' },
{ 'Serial Number': '77362117350061093222581604891734' },
{ 'Part Number': 'TR40-60C779-AA' },
{ 'Part Number': 'ST41-60C780-AA' },
{ 'Part Number': 'QT41-60C780-AA' },
{ 'Cell Count': '28' },
{ 'Cell Count': '27' },
{ 'Cell Count': '29' },
{ 'Length': '10' },
{ 'Length': '11' },
{ 'Length': '11' },
]

const keys = ['Serial Number', 'Part Number', 'Cell Count', 'Length']

const separated = arrayOfObjects.reduce((res, item) => {
  const key = Object.keys(item)[0]
  const existing = res[key] || []
  res[key] = [...existing, item[key]]
  return res
}, {})

const result = separated[keys[0]].map((_, i) => {
  return keys.reduce((res, k ) => {
    return {...res, [k]: separated[k][i]}
  }, {})
})

console.info(result)

Решение, которое не требует знания свойств заранее, состоит в том, чтобы разделить массив на подмассивы соответствующих свойств, а затем отобразить самый длинный из этих подмассивов, объединив содержащиеся объекты в один. (Для этого требуется, чтобы все подобные свойства были последовательными в исходном массиве.)

const arrayOfObjects = [{ 'Serial Number': '90946117350061093222581604839920' }, { 'Serial Number': '77362117350061093222581604891733' }, { 'Serial Number': '77362117350061093222581604891734' }, { 'Part Number': 'TR40-60C779-AA' }, { 'Part Number': 'ST41-60C780-AA' }, { 'Part Number': 'QT41-60C780-AA' }, { 'Cell Count': '28' }, { 'Cell Count': '27' }, { 'Cell Count': '29' }, { 'Length': '10' }, { 'Length': '11' }, { 'Length': '11' },];

const grouped = [];
let prev;
for (const obj of arrayOfObjects) {
  const [key] = Object.keys(obj);
  if (key !== prev) {
    grouped.push([]);
  }
  grouped.at(-1).push(obj);
  prev = key;
}

const result = grouped
  .sort(({ length: a }, { length: b }) => b - a)[0]
  .map((_, i) => Object.assign(...grouped.map(p => p[i] ?? {})));

console.info(result)

Или, используя группировку, если порядок исходного массива неизвестен (объект, в котором заканчиваются отдельные свойства, по-прежнему будет чувствителен к порядку исходного массива)

const arrayOfObjects = [{ 'Serial Number': '90946117350061093222581604839920' }, { 'Serial Number': '77362117350061093222581604891733' }, { 'Serial Number': '77362117350061093222581604891734' }, { 'Part Number': 'TR40-60C779-AA' }, { 'Part Number': 'ST41-60C780-AA' }, { 'Part Number': 'QT41-60C780-AA' }, { 'Cell Count': '28' }, { 'Cell Count': '27' }, { 'Cell Count': '29' }, { 'Length': '10' }, { 'Length': '11' }, { 'Length': '11' },];

const grouped = {}
for (const obj of arrayOfObjects) {
  const [[key, value]] = Object.entries(obj);
  (grouped[key] ??= []).push(value);
}

const result = [];
for (const [key, values] of Object.entries(grouped)) {
  for (const [i, value] of values.entries()) {
    (result[i] ??= {})[key] = value;
  }
}

console.info(result)

не могли бы вы объяснить имя переменной «chunked»? Технический жаргон/рассуждение

Jim41Mavs 05.04.2022 18:43

разбиение на фрагменты обычно выполняется по счету, т. е. для разделения массива 1d на массив 2d подмассивов одинакового размера пример, поэтому это не совсем точно для этого варианта использования. Вероятно, должно быть «сгруппировано», что немного более описательно.

pilchard 05.04.2022 18:45

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