如何将嵌套数组首元素设为对象键并构建目标JavaScript对象
问题描述
给定如下JavaScript数组:
var values = Array ( ); values [0] = Array ("", "Guest1", "Guest2", "Guest3") values [1] = Array ("Name", "Hans", "Carl", "Peter") values [2] = Array ("City", "Berlin", "Tokio", "Washington") values [3] = Array ("Phone", "123", "234", "345")
希望将其转换为如下结构的对象:
var data= { Guest1: { "Name" : "Hans", "City" : "Berlin", "Phone" : "123" }, Guest2: { "Name" : "Carl", "City" : "Tokio", "Phone" : "234" }, Guest3: { "Name" : "Peter", "City" : "Washington", "Phone" : "345" }, };
目前已经通过以下代码获取了初始键,但不清楚如何完成剩余部分的构建:
const data = Object.fromEntries(values[0].map(key => [key, 0])); delete data[""];
解决方案
这里提供几种实用的实现方式,帮你完成目标对象的构建:
方式一:硬编码属性(适合固定属性场景)
先提取访客名称,再直接为每个访客绑定对应属性值:
// 提取所有访客名称(跳过第一个空字符串) const guests = values[0].slice(1); const data = {}; guests.forEach((guestName, index) => { // 从属性行中取对应索引的值 data[guestName] = { Name: values[1][index + 1], City: values[2][index + 1], Phone: values[3][index + 1] }; });
方式二:动态遍历属性(扩展性更强)
如果后续可能新增属性行,这种方式不需要修改代码,自动适配:
const guests = values[0].slice(1); const data = {}; // 遍历每个访客 guests.forEach((guestName, guestIndex) => { const guestInfo = {}; // 遍历所有属性行(跳过第一行的访客名称) for (let i = 1; i < values.length; i++) { const [propName, ...propValues] = values[i]; guestInfo[propName] = propValues[guestIndex]; } data[guestName] = guestInfo; });
基于你现有代码的改进
你已经拿到了访客键,只需要把每个键对应的子对象填充完整即可:
// 初始化为空对象,而非0 const data = Object.fromEntries(values[0].map(key => [key, {}])); delete data[""]; // 遍历属性行填充数据 for (let i = 1; i < values.length; i++) { const [propName, ...propValues] = values[i]; propValues.forEach((value, index) => { const guestName = values[0][index + 1]; data[guestName][propName] = value; }); }
内容的提问来源于stack exchange,提问作者Co0n
相关产品推荐
相关产品推荐

