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

如何在jQuery中排序JSON对象并生成指定GROUP_CONCAT语句?

让我一步步帮你解决这两个问题:

问题1:如何在jQuery中对JSON对象进行排序并创建自定义字符串?

首先得明确一个关键点:JSON对象本身是无序的,所以我们得先把它转换成可排序的数组,再进行排序和字符串拼接。jQuery本身没有专门的排序方法,但可以结合原生JS的数组操作轻松实现,具体步骤如下:

  1. 将JSON对象转为键值对数组
    用原生JS的Object.entries()方法,把对象拆成[key, value]格式的数组,方便后续排序。如果要兼容老浏览器,也可以用jQuery的$.each()手动构建数组。

  2. 自定义规则排序数组
    利用数组的sort()方法,根据需求指定排序逻辑——可以按键名排序,也可以按value里的某个属性排序。

  3. 遍历数组生成目标字符串
    用map()或者jQuery的$.map()遍历排序后的数组,按你需要的格式拼接成字符串。

示例代码

假设我们有如下用户数据JSON:

const userData = {
  "id3": { name: "Alice", age: 28 },
  "id1": { name: "Bob", age: 22 },
  "id2": { name: "Charlie", age: 30 }
};

按键名升序排序并生成字符串

// 转为键值对数组
const entries = Object.entries(userData);
// 按键名排序
entries.sort((a, b) => a[0].localeCompare(b[0]));
// 拼接成自定义格式字符串
const resultStr = entries.map(([key, user]) => `${key}: ${user.name} (${user.age})`).join(', ');

console.log(resultStr);
// 输出:id1: Bob (22), id2: Charlie (30), id3: Alice (28)

按用户年龄升序排序

const entries = Object.entries(userData);
// 按age属性排序
entries.sort((a, b) => a[1].age - b[1].age);
// 拼接成另一种格式的字符串
const resultStr = entries.map(([key, user]) => `${user.name} (ID: ${key}) is ${user.age} years old`).join('; ');

console.log(resultStr);
// 输出:Bob (ID: id1) is 22 years old; Alice (ID: id3) is 28 years old; Charlie (ID: id2) is 30 years old

问题2:根据给定JSON生成指定的GROUP_CONCAT语句

先把给定的JSON格式化一下,方便我们分析结构:

{
  "45": {
    "AGGRE_FUN": { "GROUP_CONCAT": { "priority": 2 } },
    "DATE_TIME_FUN": { "DATE_FORMAT": { "priority": 0, "format": "%d/%m/%Y" } },
    "STR_FUN": { "CONCAT": { "priority": 1, "value": [46,45], "label": ["Add By", "Add Date"], "concat_by": "-" } }
  },
  "46": {
    "STR_FUN": { "UCASE": { "priority": 0 } }
  }
}

核心逻辑拆解

  1. 优先级决定嵌套顺序:priority值越高,函数越外层。这里GROUP_CONCAT(2) > CONCAT(1) > DATE_FORMAT/UCASE(0),所以最外层是GROUP_CONCAT,中间层是CONCAT,最内层是DATE_FORMAT和UCASE。
  2. CONCAT参数映射:CONCAT的value数组和label数组一一对应,同时关联到对应的JSON键:
    • value[0] = 46 → 对应label[0] = "Add By" → 键46的函数是UCASE,所以生成UCASE("Add By")
    • value[1] = 45 → 对应label[1] = "Add Date" → 键45的函数是DATE_FORMAT,格式为%d/%m/%Y,所以生成DATE_FORMAT("Add Date", "%d/%m/%Y")
  3. 拼接CONCAT内容:用concat_by指定的"-"连接两个内层函数,得到CONCAT(DATE_FORMAT("Add Date", "%d/%m/%Y"), "-", UCASE("Add By"))
  4. 套上最外层函数:最终得到目标SQL片段。

实现代码(JS/jQuery)

const jsonData = {
  "45": {
    "AGGRE_FUN": { "GROUP_CONCAT": { "priority": 2 } },
    "DATE_TIME_FUN": { "DATE_FORMAT": { "priority": 0, "format": "%d/%m/%Y" } },
    "STR_FUN": { "CONCAT": { "priority": 1, "value": [46,45], "label": ["Add By", "Add Date"], "concat_by": "-" } }
  },
  "46": {
    "STR_FUN": { "UCASE": { "priority": 0 } }
  }
};

// 1. 获取最外层函数(GROUP_CONCAT)
const outerFunName = Object.keys(jsonData["45"].AGGRE_FUN)[0];

// 2. 处理CONCAT的参数
const concatConfig = jsonData["45"].STR_FUN.CONCAT;
const concatParams = concatConfig.value.map((key, index) => {
  const label = concatConfig.label[index];
  const targetObj = jsonData[key];
  
  // 找到对应的函数类型和名称
  let funName, funConfig;
  if (targetObj.STR_FUN) {
    funName = Object.keys(targetObj.STR_FUN)[0];
    funConfig = targetObj.STR_FUN[funName];
  } else if (targetObj.DATE_TIME_FUN) {
    funName = Object.keys(targetObj.DATE_TIME_FUN)[0];
    funConfig = targetObj.DATE_TIME_FUN[funName];
  }
  
  // 生成函数片段
  return funName === "DATE_FORMAT" 
    ? `${funName}("${label}", "${funConfig.format}")` 
    : `${funName}("${label}")`;
});

// 3. 拼接CONCAT语句
const concatStr = `CONCAT(${concatParams.join(', "' + concatConfig.concat_by + '", ')})`;

// 4. 套上最外层GROUP_CONCAT
const finalSql = `${outerFunName}(${concatStr})`;

console.log(finalSql);
// 输出:GROUP_CONCAT(CONCAT(DATE_FORMAT("Add Date", "%d/%m/%Y"), "-", UCASE("Add By")))

内容的提问来源于stack exchange,提问作者Rahul Tank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:48:04