JavaScript对象扁平化问题:如何将嵌套属性存入数组
处理嵌套JavaScript对象为扁平结构
问题描述
我有一个包含大量数据的JavaScript对象,简化示例如下:
{ "Building": 4, "Doors":{ "a": 345, "b": 87, "c": 98 }, "EmployeeId": 565, "EmployeeLocation": { "a": "FL HQ", "b": "New York", "c": "Chicago" } }
希望遍历该对象,将嵌套对象(如Doors、EmployeeLocation)转换为「父键+子键大写」的键值对,最终得到一个扁平对象,预期结果:
{ "Building": 4, "DoorsA": 345, "DoorsB": 87, "DoorsC": 98, "EmployeeId": 565, "EmployeeLocationA": "FL HQ", "EmployeeLocationB": "New York", "EmployeeLocationC": "Chicago" }
尝试了以下代码但无法正确实现,请求帮助:
Object.keys(Details).forEach((key, value) => { if(typeof( Details[key]) === 'object' ){ const objPositions = Details[key]; // holds inner values console.log("objposition " + objPositions[key] + allDetails[key]) console.log("---->" + key + "X " + objPositions.x); console.log("---->" + key + "Y " + objPositions.y); console.log("---->" + key + "Z " + objPositions.z); let xKey = key + "X" arr.push(key + "X" , objPositions.x) // arr.push(xKey.toString() : objPositions.x.toString()) }
解决方案
你的代码存在几个问题:误用数组存储键值对、硬编码子键、参数使用错误。以下是正确的实现:
function flattenObject(obj) { const result = {}; Object.entries(obj).forEach(([key, value]) => { // 排除null(typeof null会返回object) if (typeof value === 'object' && value !== null) { Object.entries(value).forEach(([subKey, subValue]) => { const newKey = key + subKey.toUpperCase(); result[newKey] = subValue; }); } else { result[key] = value; } }); return result; } // 测试用例 const Details = { "Building": 4, "Doors":{ "a": 345, "b": 87, "c": 98 }, "EmployeeId": 565, "EmployeeLocation": { "a": "FL HQ", "b": "New York", "c": "Chicago" } }; const flattenedResult = flattenObject(Details); console.log(flattenedResult);
关键说明
- 使用
Object.entries()直接获取键值对,比Object.keys()更高效 - 增加
value !== null判断,避免误处理null值 - 动态遍历嵌套对象的所有子键,无需硬编码子键名称
- 用空对象存储结果,而非数组,符合预期的扁平对象结构
- 通过
subKey.toUpperCase()将子键转为大写,拼接成新键
内容的提问来源于stack exchange,提问作者jpavlov
相关产品推荐
相关产品推荐

