You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:42:20