如何将 2 个数组转换为具有键值对的对象
How to turn 2 arrays into an object with key value pairs
我有一个包含 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]
}
})
但还没有完全实现我想要的,欢迎任何帮助。谢谢
编辑:
我刚刚意识到,对于 moduleDetailsVal,有时值是这样的数组:
const objectsWithMultipleArrays = {
Battery: {
batteryDetailsKey: ['serial_no', 'type', 'part_no'],
batteryDetailsVal: [
'HJ3CA19347410218LJ98 151 QC',
'Extended Range',
'4P94-Q051',
],
},
Modules: {
moduleDetailsKey: ['serial_no', 'part_no', 'Cell Count'],
moduleDetailsVal: [
[
"8367532735006109322258162 53",
"LJ98-10C779-A54",
"28",
],
[
"8367532735006109322258163 54",
"LJ98-10C779-A55",
"27",
],
[
"8367532735006109322258163 56",
"LJ98-10C779-A56",
"27"
]
],
},
};
现在希望该对象具有像这样的对象数组
const newDesiredObject = {
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"
},
{
"serial_no": "8367532735006109322258160 51",
"part_no": "LJ98-10C779-A52",
"cell_count": "33"
},
{
"serial_no": "8367532735006109322258160 52",
"part_no": "LJ98-10C779-A53",
"cell_count": "33"
},
]
}
请告知我如何处理这种情况
我假设:
- 两个数组的长度始终相等。或者
- 键的数组(数组 1)更大,您需要数组 1 中的所有键,所有多余的键都将具有值
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);
您可以使用 objects
对象的条目来获取键值对数组。然后,您可以映射这个键值对数组,以便更新每个值以拥有一个新对象。这个新对象可以使用 Object.fromEntries()
构建,并将在以 "DetailsKey"
结尾的键处找到的数组映射到另一组 key-value 对的数组,其中每个值都是来自以 "DetailsVal"
结尾的键的数组(我们可以使用索引 i
来抓取相应的项目)。然后,您可以将映射的 objects
的条目包装在对 Object.fromEntries()
的另一个调用中,这将从新的 key-value 对数组中为您构建一个对象:
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);
如果您可以依赖对象 property/value 命令 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);
我有一个包含 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]
}
})
但还没有完全实现我想要的,欢迎任何帮助。谢谢
编辑:
我刚刚意识到,对于 moduleDetailsVal,有时值是这样的数组:
const objectsWithMultipleArrays = {
Battery: {
batteryDetailsKey: ['serial_no', 'type', 'part_no'],
batteryDetailsVal: [
'HJ3CA19347410218LJ98 151 QC',
'Extended Range',
'4P94-Q051',
],
},
Modules: {
moduleDetailsKey: ['serial_no', 'part_no', 'Cell Count'],
moduleDetailsVal: [
[
"8367532735006109322258162 53",
"LJ98-10C779-A54",
"28",
],
[
"8367532735006109322258163 54",
"LJ98-10C779-A55",
"27",
],
[
"8367532735006109322258163 56",
"LJ98-10C779-A56",
"27"
]
],
},
};
现在希望该对象具有像这样的对象数组
const newDesiredObject = {
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"
},
{
"serial_no": "8367532735006109322258160 51",
"part_no": "LJ98-10C779-A52",
"cell_count": "33"
},
{
"serial_no": "8367532735006109322258160 52",
"part_no": "LJ98-10C779-A53",
"cell_count": "33"
},
]
}
请告知我如何处理这种情况
我假设:
- 两个数组的长度始终相等。或者
- 键的数组(数组 1)更大,您需要数组 1 中的所有键,所有多余的键都将具有值
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);
您可以使用 objects
对象的条目来获取键值对数组。然后,您可以映射这个键值对数组,以便更新每个值以拥有一个新对象。这个新对象可以使用 Object.fromEntries()
构建,并将在以 "DetailsKey"
结尾的键处找到的数组映射到另一组 key-value 对的数组,其中每个值都是来自以 "DetailsVal"
结尾的键的数组(我们可以使用索引 i
来抓取相应的项目)。然后,您可以将映射的 objects
的条目包装在对 Object.fromEntries()
的另一个调用中,这将从新的 key-value 对数组中为您构建一个对象:
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);
如果您可以依赖对象 property/value 命令 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);