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

JavaScript如何按size属性将扁平对象数组转换为指定层级嵌套结构

JavaScript扁平对象数组按size字段转嵌套层级实现

你之前代码的核心问题是直接修改了根数组start的引用,导致处理完子层级后无法回到根节点。另外你对JS的引用特性存在误解:JS中对象、数组均为引用类型,完全可以通过引用操作实现层级挂载。

正确实现代码

// 输入数据
const inp = [{size: 12, "text": "aa"}, {size: 11, "text": "ab"}, {size: 10, "text": "ac"}, {size: 12, "text": "ad"}];
// 根数组,永远保留最外层引用不修改
const result = [];

inp.forEach(item => {
    // 每次处理新元素都重置当前指针到根层级
    let currentLevel = result;
    // 寻找正确的插入层级
    while (true) {
        const lastItem = currentLevel.at(-1);
        // 当前层级为空/当前元素size >= 当前层级最后一个元素的size,直接插入当前层级
        if (!lastItem || item.size >= lastItem.size) {
            currentLevel.push({...item, childrens: []});
            break;
        }
        // 当前元素size更小,进入最后一个元素的子层级继续判断
        currentLevel = lastItem.childrens;
    }
});

console.log(JSON.stringify(result, null, 2));

逻辑说明

  • 用临时变量currentLevel追踪插入层级,根数组result永远不会被重新赋值,保证最终结果完整
  • 每次处理新元素都将指针重置回根层级,避免上一个元素的层级遍历影响当前元素
  • 满足插入条件时直接在当前层级推入带空childrens的新元素,否则就进入子层级继续匹配

运行输出示例

以上述输入为例,运行后输出结构完全符合预期嵌套规则:

[
  {
    "size": 12,
    "text": "aa",
    "childrens": [
      {
        "size": 11,
        "text": "ab",
        "childrens": [
          {
            "size": 10,
            "text": "ac",
            "childrens": []
          }
        ]
      }
    ]
  },
  {
    "size": 12,
    "text": "ad",
    "childrens": []
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:36:03