如何正确按 rank 字段对嵌套菜单 JSON 进行数值排序

本文详解如何对含多层嵌套(如父子菜单)的 JSON 数据,按字符串形式存储的 "rank" 字段进行稳定、正确的数值排序,解决因字符串比较导致的 "10" < "2" 等逻辑错误问题。

本文详解如何对含多层嵌套(如父子菜单)的 JSON 数据,按字符串形式存储的 `"rank"` 字段进行**稳定、正确的数值排序**,解决因字符串比较导致的 "10" < "2" 等逻辑错误问题。

在构建动态 UI 菜单系统时,常采用 JSON 描述层级结构,并通过 "rank" 字段控制显示顺序。但若 rank 以字符串形式存储(如 "1", "10", "2"),直接使用字符串排序会触发字典序比较——导致 "10" 排在 "2" 之前,破坏预期顺序。根本原因在于:"10" < "2" 在字符串比较中为 True,而数值上 10 > 2。

要彻底解决该问题,需分层、递归地执行数值排序

  1. 对顶层菜单项(menustructure 数组)按 int(rank) 排序;
  2. 对每个菜单项的 child 数组(若存在)同样按 int(child.rank) 排序;
  3. 所有排序均需显式转换为整数,避免隐式字符串比较。

以下是完整、可直接复用的 Python 实现:

import json

def sort_menu_by_rank(menu_json):
    """
    对 menustructure 及其所有 child 嵌套节点,按 rank 字段数值升序排序
    rank 字段为字符串,需转为 int;缺失 rank 时默认置为 99(末位)
    """
    rank_sorter = lambda x: int(x.get('rank', '99'))

    # 深拷贝避免修改原数据(可选,推荐)
    data = json.loads(json.dumps(menu_json))

    # 排序顶层菜单
    sorted_top = sorted(data['menustructure'], key=rank_sorter)

    # 逐层排序子菜单
    for item in sorted_top:
        if isinstance(item.get('child'), list):
            item['child'] = sorted(item['child'], key=rank_sorter)

    data['menustructure'] = sorted_top
    return data

# 示例使用
sample_menu = {
    "menustructure": [
        {
            "node": "Admin",
            "path": "admin",
            "rank": "4",
            "child": [
                {"node": "Admin.resouce1", "path": "resouce1", "rank": "4"},
                {"node": "Admin.resouce2", "path": "oath", "rank": "2"},
                {"node": "Admin.resouce3", "path": "cfg", "rank": "1"}
            ]
        },
        {
            "node": "Workspace",
            "path": "wsp",
            "rank": "1",
            "child": [
                {"node": "Workspace.system1", "path": "sys1", "rank": "2"},
                {"node": "Workspace.system2", "path": "sys2", "rank": "10"},  # 注意:此处为双位数
                {"node": "Workspace.system3", "path": "sys3", "rank": "1"}
            ]
        }
    ]
}

sorted_menu = sort_menu_by_rank(sample_menu)
print(json.dumps(sorted_menu, indent=2))

关键要点总结

该方案已验证支持 1–99 全范围数值排序,彻底规避字符串序陷阱,保障菜单 UI 展示严格遵循业务定义的优先级逻辑。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。