我有一組具有相同鍵的物件,我想創建一個新的物件陣列,該陣列創建一個新物件,將唯一的物件組合在一起
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})
}
}
})
})
uj5u.com熱心網友回復:
我認為最好先將它們分開然后再放回去
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)
uj5u.com熱心網友回復:
不需要提前知道屬性的解決方案是將陣列分成匹配屬性的子陣列,然后映射這些子陣列中最長的子陣列,將包含的物件合并為一個。(這確實要求所有類似的屬性在源陣列中都是連續的。)
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/455813.html
標籤:javascript 数组 循环 目的
