如何将JSON对象键作为函数参数传递并实现双键排序函数
按双键排序JSON数组&动态传递键参数的解决方案
没问题,我来帮你搞定这个排序函数,顺便把「动态传递键参数」的逻辑讲清楚~
一、修正你的排序函数
你原来的函数里踩了个小坑:直接用a.key_1是错误的,因为key_1是你传入的变量参数,不是对象的字面量属性名。JavaScript里访问动态属性必须用方括号语法,我给你修正后的函数:
function sort_json_key1_then_key2(jsonArr, key1, key2) { // 注意:你的示例obj是数组,所以参数名改成jsonArr更准确 jsonArr.sort(function(a, b) { // 先处理第一个排序键,转为数字保持你原来的逻辑 const valA1 = +a[key1]; const valB1 = +b[key1]; if (valA1 !== valB1) { // 数字比较直接用减法,比三目运算符更简洁清晰 return valA1 - valB1; } // 第一个键相等时,处理第二个排序键 const valA2 = +a[key2]; const valB2 = +b[key2]; return valA2 - valB2; }); }
二、动态传递键参数的核心原理
为什么不能用点语法a.key1?因为JavaScript会把点后面的内容当作字面量属性名,比如a.key1会去找对象a里名为"key1"的属性,而不是你传入的变量key1的值(比如"cl")。
而方括号语法a[key1]会先解析变量key1的实际值,再去访问对应的属性——这正是我们需要的「动态访问属性」的方式。
三、用你的示例数据演示完整用法
先补全你的示例数组(假设完整数据如下):
var obj = [ {"cl":"8","fare":"500.0","name":"41"}, {"cl":"7","fare":"200.0","name":"37"}, {"cl":"10","fare":"200.0","name":"22"}, {"cl":"7","fare":"300.0","name":"15"} ];
调用函数,传入你想要排序的两个键:
// 先按cl升序排序,cl相同则按fare升序排序 sort_json_key1_then_key2(obj, "cl", "fare");
排序后的结果会是:
[ {"cl":"7","fare":"200.0","name":"37"}, {"cl":"7","fare":"300.0","name":"15"}, {"cl":"8","fare":"500.0","name":"41"}, {"cl":"10","fare":"200.0","name":"22"} ]
额外小提示
- 如果需要支持字符串自然排序(比如
name字段),可以去掉+号,改用localeCompare方法:a[key1].localeCompare(b[key1]),这样排序更符合字符串的阅读习惯。 sort方法会原地修改原数组,如果不想破坏原数据,可以先复制一份再排序:const sortedArr = [...jsonArr].sort(...)。
内容的提问来源于stack exchange,提问作者Gp Master
相关产品推荐
相关产品推荐

