0%

flask | 如何将字典中的数据按照顺序发送给前端

python 中的字典是有顺序的,但是,map 变为 json 发送给前端,那么 json 是无序的。

网上有很多方法,比如 OrderedDict 来构造 json 啥的,最后试了都不行,最终的方案是这样的。

1
2
3
4
5
6
7
8
9
10
{
'法国斗牛犬百科_2444': {
'序言_2445': [ '关于我们_2446' ],
'演变_2447': [ '法斗历史_2448' ],
'样貌_2449': [ '品种_2454', '四肢_2450', '尾巴_2451', '身型_2452', '五官_2453' ],
'健康_2460': [],
'训练_2461': []
},
'博美_2519': { '博美1_2520': [ '博美文章1_2521' ], '博美2_2522': [] }
}

变成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
'key': '法国斗牛犬百科_2444',
'value': [
{'key': '序言_2445', 'value': ['关于我们_2446']}, {'key': '演变_2447', 'value': ['法斗历史_2448']}, {
'key': '样貌_2449',
'value': ['品种_2454', '四肢_2450', '尾巴_2451', '身型_2452', '五官_2453']
}, {'key': '健康_2460', 'value': []}, {'key': '训练_2461', 'value': []}
]
},
{
'key': '博美_2519', 'value': [
{'key': '博美1_2520', 'value': ['博美文章1_2521']}, {'key': '博美2_2522', 'value': []}
]
}
]

python 的代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def transform_dict(input_dict):
# 检查输入是否为字典
if isinstance(input_dict, dict):
# 创建一个空列表来存储转换后的键值对
transformed = []
# 遍历字典中的每个键值对
for key, value in input_dict.items():
# 递归调用transform_dict来处理值,这样可以处理嵌套的字典
transformed_value = transform_dict(value)
# 将当前的键和转换后的值添加到结果列表中
transformed.append({
"key": key,
"value": transformed_value
})
# 如果结果列表只有一个元素,直接返回该元素,否则返回整个列表
return transformed[0] if len(transformed) == 1 else transformed
else:
# 如果输入不是字典,直接返回原始输入
return input_dict

js 的解析代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function transformArrayToObject(inputArray) {
let result = {};
inputArray.forEach(item => {
if (typeof item === 'object' && item !== null && 'key' in item && 'value' in item) {
// 检查value是否为数组
if (Array.isArray(item.value)) {
// 如果数组中的第一个元素是对象,则递归处理
if (item.value.length > 0 && typeof item.value[0] === 'object') {
result[item.key] = transformArrayToObject(item.value);
} else {
// 否则直接将数组赋给key
result[item.key] = item.value;
}
} else {
// 如果value不是数组,直接赋值
result[item.key] = item.value;
}
}
});
return result;
}

上面的代码都是用 cloud 写的,所以,如果你有其它结构,直接问就行,方案按照我这个方案即可。

请我喝杯咖啡吧~