如何将具有相同键的数组中的对象转换为同一数组中它们自己的单独对象
How to turn objects in an array with the same keys into a seperate object of their own in the same array
我有一个具有相同键的对象数组,我想创建一个新的对象数组,该数组创建一个新对象,将唯一的对象组合成一个
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})
}
}
})
})
我认为最好先将它们分开,然后再重新组合起来
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.log(result)
不需要提前知道属性的解决方案是将数组分成 sub-arrays 个匹配 属性,然后映射最长的 sub-arrays ] 将包含的对象合并为一个。 (这确实要求所有类似的属性在源数组中是连续的。)
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.log(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.log(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 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})
}
}
})
})
我认为最好先将它们分开,然后再重新组合起来
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.log(result)
不需要提前知道属性的解决方案是将数组分成 sub-arrays 个匹配 属性,然后映射最长的 sub-arrays ] 将包含的对象合并为一个。 (这确实要求所有类似的属性在源数组中是连续的。)
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.log(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.log(result)