导读:本期聚焦于小伙伴创作的《JavaScript中如何将扁平化对象拆分为结构化对象数组》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript中如何将扁平化对象拆分为结构化对象数组》有用,将其分享出去将是对创作者最好的鼓励。

在前端开发过程中,我们经常会遇到接口返回扁平化对象的情况,比如返回的数据是{name_1: '张三', age_1: 18, name_2: '李四', age_2: 20}这种格式,而页面渲染需要的是[{name: '张三', age: 18}, {name: '李四', age: 20}]这样的结构化对象数组,这时候就需要掌握将扁平化对象拆分为结构化对象数组的方法。

JavaScript中如何将扁平化对象拆分为结构化对象数组

基础实现思路

拆分的核心逻辑是先识别扁平化对象中键名的规律,通常这类对象的键名会带有数字后缀用来区分不同的数据项,我们可以先提取出所有的后缀标识,再按照标识分组组装成对应的对象,最后组成数组。

步骤拆解

  • 第一步:获取扁平化对象的所有键名,遍历键名提取出公共前缀和数字后缀
  • 第二步:对数字后缀去重,得到所有数据项的标识集合
  • 第三步:遍历每个标识,从原对象中匹配对应前缀的键值,组装成单个对象
  • 第四步:将所有组装好的单个对象放入数组,得到最终的结构化对象数组

常规实现方案

我们可以通过循环遍历的方式实现拆分,以下是针对键名带下划线加数字后缀的扁平化对象的处理示例:

// 待拆分的扁平化对象
const flatObj = {
  name_1: '张三',
  age_1: 18,
  name_2: '李四',
  age_2: 20,
  name_3: '王五',
  age_3: 22
};

// 拆分函数
function splitFlatObjToArray(obj) {
  const result = [];
  // 存储所有出现的数字后缀
  const suffixes = new Set();
  // 存储前缀和对应键名的映射
  const prefixMap = {};

  // 遍历对象所有键名
  for (const key in obj) {
    // 匹配键名中的前缀和数字后缀,假设格式是 前缀_数字
    const match = key.match(/^(.+)_(d+)$/);
    if (match) {
      const prefix = match[1];
      const suffix = match[2];
      suffixes.add(suffix);
      if (!prefixMap[prefix]) {
        prefixMap[prefix] = {};
      }
      prefixMap[prefix][suffix] = obj[key];
    }
  }

  // 按照后缀组装对象
  suffixes.forEach(suffix => {
    const item = {};
    for (const prefix in prefixMap) {
      if (prefixMap[prefix][suffix] !== undefined) {
        item[prefix] = prefixMap[prefix][suffix];
      }
    }
    result.push(item);
  });

  return result;
}

const structuredArray = splitFlatObjToArray(flatObj);
console.log(structuredArray);
// 输出:[{name: '张三', age: 18}, {name: '李四', age: 20}, {name: '王五', age: 22}]

使用Object.entries优化实现

借助Object.entries方法可以直接获取对象的键值对数组,简化遍历逻辑,以下是优化后的实现:

const flatObj = {
  user_name_1: '张三',
  user_age_1: 18,
  user_name_2: '李四',
  user_age_2: 20
};

function splitObjToArray(obj) {
  const tempMap = {};
  Object.entries(obj).forEach(([key, value]) => {
    const match = key.match(/^(.+)_(d+)$/);
    if (match) {
      const prefix = match[1];
      const suffix = match[2];
      if (!tempMap[suffix]) {
        tempMap[suffix] = {};
      }
      tempMap[suffix][prefix] = value;
    }
  });
  return Object.values(tempMap);
}

const res = splitObjToArray(flatObj);
console.log(res);
// 输出:[{user_name: '张三', user_age: 18}, {user_name: '李四', user_age: 20}]

注意事项

实际开发中扁平化对象的键名格式可能不统一,比如有的用点分隔,有的没有固定后缀,这时候需要调整正则匹配的规则,确保能正确提取出数据项的标识。如果原对象中存在不符合拆分规则的键名,建议在遍历时增加过滤逻辑,避免将这些无效键值加入最终的结构化数组中。

另外如果扁平化对象的数据量较大,需要注意遍历的性能,尽量减少不必要的循环操作,比如提前缓存需要的前缀集合,避免重复遍历键名。

JavaScript扁平化对象结构化对象数组对象拆分修改时间:2026-07-03 19:51:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。