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

如何实现保留结构的对象键到嵌套name/children对象的映射函数?

优雅实现对象键到name属性对象的层级转换

嘿,我完全理解你想要的转换效果——把原对象的每个键都转成带name属性的对象,同时完整保留层级结构。递归确实是这个问题的核心解法,但我们可以把它写得简洁又优雅,完全不用搞得繁琐复杂!

核心思路

先明确转换规则:

  • 每个对象键对应一个{name: 键名}的对象
  • 如果键值是嵌套对象,给该对象添加children属性,值为嵌套对象转换后的结果数组
  • 如果键值是数组,我们取数组第一个元素的结构来生成children(毕竟你的示例里数组元素结构一致,只需保留结构而非每个元素都生成项)

简洁实现代码

// 递归处理对象/数组的转换逻辑
const transformNode = (data) => {
  // 处理普通对象(非数组)
  if (typeof data === 'object' && data !== null && !Array.isArray(data)) {
    return Object.entries(data).map(([key, value]) => {
      const node = { name: key };
      // 若值是对象/数组,递归生成children
      if (typeof value === 'object' && value !== null) {
        // 数组取第一个元素来解析结构(适配示例中数组元素结构一致的场景)
        const target = Array.isArray(value) && value.length ? value[0] : value;
        node.children = transformNode(target);
      }
      return node;
    });
  }
  // 叶子节点(非对象/数组)无需children,返回空数组
  return [];
};

// 处理顶层对象(输入是单键顶层对象的情况)
const convertToNameTree = (obj) => {
  const [topKey, topValue] = Object.entries(obj)[0];
  return {
    name: topKey,
    children: transformNode(topValue)
  };
};

// 测试示例输入
const input = { 
  person: { 
    first_name: "fn", 
    last_name: "ln", 
    address: { city: "c", street: "s" }, 
    movies: [ { title: "movie1" }, { title: "movie2" } ] 
  } 
};

console.log(JSON.stringify(convertToNameTree(input), null, 2));

代码解释

  • transformNode是核心递归函数:遍历对象的键值对,生成对应的name节点,遇到嵌套结构时递归处理并挂载到children上
  • 针对数组的处理:因为你的示例中数组元素结构完全一致,所以只取第一个元素来解析结构,避免生成重复的name项
  • convertToNameTree专门处理顶层对象,把输入的单键顶层对象转换成符合要求的顶层name节点

运行这段代码后,就能得到你期望的输出结果啦!这种写法把递归逻辑封装得很紧凑,没有多余的冗余代码,维护起来也很方便。

内容的提问来源于stack exchange,提问作者Rus Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:51:52