You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:30:15