如何在jQuery中排序JSON对象并生成指定GROUP_CONCAT语句?
让我一步步帮你解决这两个问题:
问题1:如何在jQuery中对JSON对象进行排序并创建自定义字符串?
首先得明确一个关键点:JSON对象本身是无序的,所以我们得先把它转换成可排序的数组,再进行排序和字符串拼接。jQuery本身没有专门的排序方法,但可以结合原生JS的数组操作轻松实现,具体步骤如下:
将JSON对象转为键值对数组
用原生JS的Object.entries()方法,把对象拆成[key, value]格式的数组,方便后续排序。如果要兼容老浏览器,也可以用jQuery的$.each()手动构建数组。自定义规则排序数组
利用数组的sort()方法,根据需求指定排序逻辑——可以按键名排序,也可以按value里的某个属性排序。遍历数组生成目标字符串
用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 } } } }
核心逻辑拆解
- 优先级决定嵌套顺序:
priority值越高,函数越外层。这里GROUP_CONCAT(2) >CONCAT(1) >DATE_FORMAT/UCASE(0),所以最外层是GROUP_CONCAT,中间层是CONCAT,最内层是DATE_FORMAT和UCASE。 - 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")
- 拼接CONCAT内容:用
concat_by指定的"-"连接两个内层函数,得到CONCAT(DATE_FORMAT("Add Date", "%d/%m/%Y"), "-", UCASE("Add By")) - 套上最外层函数:最终得到目标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
相关产品推荐
相关产品推荐

