按排名对json中的菜单进行排序

0 投票
1 回答
33 浏览
提问于 2025-04-14 16:09

我有一个关于用户界面菜单的json结构。我的目标是,当用户在界面上添加新菜单项或者修改任何父菜单或子菜单的排序值时,这个json结构应该根据排序值进行排序。

我遇到的问题是,我的排序方法在排序值是个位数时可以正常工作,但一旦排序值变成两位数,比如10、11、12……99,排序就不再按预期进行,菜单也没有按照正确的顺序排列。

以下是菜单结构的示例:

{
    "menustructure": 
    [
            {
             "node":"Admin",
             "path":"admin",
             "rank": "1",
                "child":[
                        {
                            "node": "Admin.resouce1",
                            "path":"resouce1",
                            "rank":"1"
                         },
                    
                        {"node":"Admin.resouce2",
                            "path": "oath",
                            "rank":"2"
                        }
                       ]
            },
            {
                "node":"Workspace",
                "path": "wsp",
                "rank":"2",
                "child":[{
                        "node": "Workspace.system1",
                        "path":"sys1",
                        "rank": "1"
                    
                    },
                    {
                        "node": "Workspace.system2",
                        "path":"sys2",
                        "rank": "2"
                    }
                ]
            }

        
    ]
}

**我尝试的代码:**

config['menu-config'] = sorted(config['menu-config'], key=lambda x: int(x.get('rank', float('inf'))))

父菜单或子菜单的最大排序值可以是1到99。

1 个回答

0

你需要遍历你的结构,给子节点排序,而不是现在你试图处理的顶层节点,这样做其实没什么意义,因为顶层节点根本没有rank字段。可以参考下面这个示例(我稍微简化了你的菜单结构,去掉了一些不相关的字段):

import json

menu_json = {
    "menustructure": [{
            "node":"Admin",
            "rank": "4",
            "child":[
                { "rank":"4" },
                { "rank":"2" },
                { "rank":"3" },
                { "rank":"1" },
            ]}, {
            "node":"Workspace",
            "rank": "1",
            "child":[
                { "rank": "2" },
                { "rank": "4" },
                { "rank": "1" },
            ]
        }
    ]
}

# separated sorting lambda for reuse
rank_sorter = lambda x: int(x.get('rank', 99))

# sort top-level nodes
sorted_menu = sorted(menu_json['menustructure'], key=rank_sorter)
# sort nested nodes
for menu_item in sorted_menu:
  if 'child' in menu_item:
     menu_item['child'] = sorted(menu_item['child'], key=rank_sorter)
sorted_menu = {'menustructure': sorted_menu}

print(json.dumps(sorted_menu, indent=4))

这样做会得到

[
  {
    "node": "Workspace",
    "rank": "1",
    "child": [
      {
        "rank": "1"
      },
      {
        "rank": "2"
      },
      {
        "rank": "4"
      }
    ]
  },
  {
    "node": "Admin",
    "rank": "4",
    "child": [
      {
        "rank": "1"
      },
      {
        "rank": "2"
      },
      {
        "rank": "3"
      },
      {
        "rank": "4"
      }
    ]
  }
]

撰写回答