我有一個物件,其中包含 2 個具有屬性的物件:
const objects = {
Battery: {
batteryDetailsKey: ['serial_no', 'type', 'part_no'],
batteryDetailsVal: [
'HJ3CA19347410218LJ98 151 QC',
'Extended Range',
'4P94-Q051',
],
},
Modules: {
moduleDetailsKey: ['serial_no', 'part_no', 'Cell Count'],
moduleDetailsVal: [
'8367532735006109322258160 50',
'LJ98-10C779-A51',
'32',
'6',
],
},
};
我需要將資料結構更改為:
const desiredObject = {
Battery: {
'serial_no': 'HJ3CA19347410218LJ98 151 QC',
'type': 'Extended Range',
'part_no': '4P94-Q051',
},
Modules: {
'serial_no':'8367532735006109322258160 50',
'part_no':'LJ98-10C779-A51',
'cell_count': '32',
},
};
我努力了
let emptyObject = {}
Object.keys(objects).forEach((q, i) => {
emptyObject = {
objects[q]
}
})
但并沒有完全實作我想要的,歡迎任何幫助。謝謝
uj5u.com熱心網友回復:
我假設:
- 兩個陣列的長度總是相等的。要么
- 鍵的陣列(陣列 1)更大,您想要陣列 1 中的所有鍵,所有多余的鍵都將具有 value
undefined。要么 - 鍵的陣列(陣列 1)較小,您想跳過值陣列(陣列 2)中存在的所有額外值。
您可以嘗試下面的代碼,我在陣列 1 上使用了Array reduce()index并使用引數訪問陣列 2 中的相應值。為了回圈objects我使用的物件Object.keys()并創建了一個新的所需物件。
因此,您的問題的完整答案將如下所示:
const objects = {
Battery: {
batteryDetailsKey: ["serial_no", "type", "part_no"],
batteryDetailsVal: ["HJ3CA19347410218LJ98 151 QC", "Extended Range", "4P94-Q051"],
},
Modules: {
moduleDetailsKey: ["serial_no", "part_no", "Cell Count"],
moduleDetailsVal: ["8367532735006109322258160 50", "LJ98-10C779-A51", "32", "6"],
},
};
function twoArraysToObject(arr1, arr2) {
return arr1.reduce((obj, item, index) => {
obj[item] = arr2[index];
return obj;
}, {});
}
const desiredObject = {};
Object.keys(objects).forEach((key) => {
const keyNamesArr = Object.keys(objects[key]);
desiredObject[key] = twoArraysToObject(objects[key][keyNamesArr[0]], objects[key][keyNamesArr[1]]);
});
console.log(desiredObject);
uj5u.com熱心網友回復:
您可以獲取objects物件的條目以獲取鍵值對陣列。然后,您可以映射此鍵值對陣列,以便將每個值更新為具有一個新物件。這個新物件可以使用Object.fromEntries()在鍵結尾處找到的陣列并將其映射"DetailsKey"到另一組鍵值對的陣列來構建,其中每個值都是鍵結尾處的陣列中的關聯值"DetailsVal"(我們可以使用索引i抓取相應的物品)。然后,您可以將 mappedobjects的條目包裝在對 的另一個呼叫中Object.fromEntries(),這將從新的鍵值對陣列中為您構建一個物件:
const objects = { Battery: { batteryDetailsKey: ['serial_no', 'type', 'part_no'], batteryDetailsVal: [ 'HJ3CA19347410218LJ98 151 QC', 'Extended Range', '4P94-Q051', ], }, Modules: { moduleDetailsKey: ['serial_no', 'part_no', 'cell_count'], moduleDetailsVal: [ '8367532735006109322258160 50', 'LJ98-10C779-A51', '32', '6', ], }, };
const res = Object.fromEntries(Object.entries(objects).map(([key, value]) => {
const innerEntries = Object.entries(value);
const [, details] = innerEntries.find(([key]) => key.endsWith("DetailsKey"));
const [, vals] = innerEntries.find(([key]) => key.endsWith("DetailsVal"));
return [key, Object.fromEntries(details.map((key, i) => [key, vals[i]]))];
}));
console.log(res);
如果您可以依賴Object.value()給您的物件屬性/值順序(最近才標準化),那么您可以洗掉.find()呼叫并使用索引獲取鍵:
const objects = { Battery: { batteryDetailsKey: ['serial_no', 'type', 'part_no'], batteryDetailsVal: [ 'HJ3CA19347410218LJ98 151 QC', 'Extended Range', '4P94-Q051', ], }, Modules: { moduleDetailsKey: ['serial_no', 'part_no', 'cell_count'], moduleDetailsVal: [ '8367532735006109322258160 50', 'LJ98-10C779-A51', '32', '6', ], }, };
const res = Object.fromEntries(Object.entries(objects).map(([key, value]) => {
const [details, vals] = Object.values(value);
return [key, Object.fromEntries(details.map((key, i) => [key, vals[i]]))];
}));
console.log(res);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447631.html
標籤:javascript 循环 目的 数据结构 ecmascript-6
下一篇:如何在兄弟屬性上組合物件屬性
