如何在JavaScript中按预定义键集合排序JSON数组?
按照指定键顺序排序JSON对象数组的解决方案
嘿,这个问题我熟!要按照ListB指定的顺序给ListA里每个对象的键排序,核心思路就是按照ListB的顺序重新构建每个对象——因为直接修改原对象的键顺序往往不靠谱,不如根据目标顺序重新生成新对象。下面给你两种常用编程语言的实现方案:
JavaScript 实现
你可以用map遍历ListA的每个对象,再用reduce按照ListB的顺序逐个提取键值对,构建新的排序后对象:
const listA = [ { "address": "wellington lane", "age": "23", "country": "Australia", "name": "Mike", "profession": "Lawyer" }, { "address": "Street 25", "age": "26", "country": "New Zealand", "name": "Parks", "profession": "Engineer" }, { "address": "North cross", "age": "29", "country": "Korea", "name": "Wanda", "profession": "Doctor" } ]; const listB = ["name","age","address","country","profession"]; // 生成排序后的数组 const sortedList = listA.map(obj => { return listB.reduce((sortedObj, key) => { sortedObj[key] = obj[key]; return sortedObj; }, {}); }); // 格式化输出结果 console.log(JSON.stringify(sortedList, null, 2));
这段代码的逻辑很直白:
map负责遍历ListA里的每一个原始对象reduce则以空对象为起点,按照ListB的顺序把原始对象的键值对依次添加进去,最终得到键顺序完全匹配ListB的新对象
Python 实现
Python 3.7及以上版本的字典会保留插入顺序,所以直接用字典推导式就能轻松搞定:
listA = [ {"address": "wellington lane", "age": "23", "country": "Australia", "name": "Mike", "profession": "Lawyer"}, {"address": "Street 25", "age": "26", "country": "New Zealand", "name": "Parks", "profession": "Engineer"}, {"address": "North cross", "age": "29", "country": "Korea", "name": "Wanda", "profession": "Doctor"} ] listB = ["name", "age", "address", "country", "profession"] sorted_list = [] for obj in listA: # 按ListB顺序构建新字典 sorted_obj = {key: obj[key] for key in listB} sorted_list.append(sorted_obj) # 格式化输出 import json print(json.dumps(sorted_list, indent=2))
如果你的Python版本低于3.7(字典不保留插入顺序),可以用collections.OrderedDict来强制维护顺序:
from collections import OrderedDict import json listA = [ {"address": "wellington lane", "age": "23", "country": "Australia", "name": "Mike", "profession": "Lawyer"}, {"address": "Street 25", "age": "26", "country": "New Zealand", "name": "Parks", "profession": "Engineer"}, {"address": "North cross", "age": "29", "country": "Korea", "name": "Wanda", "profession": "Doctor"} ] listB = ["name", "age", "address", "country", "profession"] sorted_list = [] for obj in listA: sorted_obj = OrderedDict() for key in listB: sorted_obj[key] = obj[key] sorted_list.append(sorted_obj) print(json.dumps(sorted_list, indent=2))
为什么之前的方案可能无效?
如果之前的尝试没成功,大概率是这两个原因:
- 直接修改原对象的键顺序,但很多语言的对象/字典默认不会保留修改后的键顺序
- 在Python 3.6及以下版本用普通字典构建新对象,导致顺序被打乱
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

