如何实现保留结构的对象键到嵌套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
相关产品推荐
相关产品推荐

