У меня есть массив объектов с одинаковыми ключами, я хочу создать новый массив объектов, который создает новый объект, объединяющий уникальные объекты в один
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})
}
}
})
})
@Ele Я думаю, это основано на заказе. Первый серийный номер, первый номер детали, первое количество ячеек и первая длина идут вместе.
if (!newArr.length){if (Object.keys(newArr[i]).toString() === key){
newArr
не имеет записей, так как же вы ожидаете установить newArr[i]
в строку?
@ user1599011 нет, это неправда. Смотрите Length
=
12
@Эле, как, когда мы только что проверили if (!newArr.length){
? Это не ключ Length
, это длина массива.
@user1599011 user1599011 Я говорю о массиве desiredArrayOfObjects
(вывод).
@ele, я вижу. Я думаю, что это, вероятно, опечатка. Но определенно затрудняет понимание.
Я думаю, будет лучше, если вы сначала разделите их, а потом соберете обратно.
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»? Технический жаргон/рассуждение
разбиение на фрагменты обычно выполняется по счету, т. е. для разделения массива 1d на массив 2d подмассивов одинакового размера пример, поэтому это не совсем точно для этого варианта использования. Вероятно, должно быть «сгруппировано», что немного более описательно.
С моей точки зрения, невозможно построить
desiredArrayOfObjects
изarrayOfObjects
, потому что между объектами вarrayOfObjects
нет никакой связи. Я имею в виду, я не вижу, как связать эти объекты между собой.