基于键过滤对象:如何将GROUP_CONCAT获取的SQL数据转为指定结构?
如何将SQL GROUP_CONCAT结果转换为嵌套的serviceObj对象数组?
看起来你已经用SQL的GROUP_CONCAT拿到了会员对应的服务数据,但需要把拼接后的字符串转换成示例里那种嵌套的serviceObj对象数组对吧?之前用filter和map没搞定,大概率是没找对字符串分割和结构转换的正确姿势,我来给你一步步拆解解决方案。
先明确场景前提
首先假设你从SQL查询回来的原始数据是类似这样的(GROUP_CONCAT把每个会员的服务拼接成了字符串,比如用逗号分隔服务项,每个服务项用冒号分隔id和name):
const rawSQLData = [ { "id": 1, "membership_name": "basic", "membership_price": "10", "services": "7:Multi-City Artisan Availability,3:Hair and/or Makeup,6:Online Booking. Easy,5:On Location. Whenever. Whe..." } ];
核心转换逻辑
我们需要把每个会员条目中的services字符串,拆分成一个个{id: xxx, name: xxx}的对象,再组成数组赋值给serviceObj。这里主要用map(遍历转换元素)就行,filter是用来筛选元素的,这里用不上它:
const transformToTargetStructure = (rawData) => { return rawData.map(membership => { // 第一步:把拼接的services字符串拆成单个服务项 const serviceStrings = membership.services.split(','); // 第二步:把每个服务项字符串转换成目标对象 const serviceObj = serviceStrings.map(serviceStr => { // 处理服务项:分割id和name(注意name里可能带冒号,所以用扩展运算符收集剩余部分) const [idStr, ...nameSegments] = serviceStr.split(':'); const name = nameSegments.join(':').trim(); // 合并可能带冒号的名称,去掉多余空格 return { id: parseInt(idStr, 10), // 把字符串id转成数字类型 name: name }; }); // 第三步:返回包含serviceObj的新会员对象 return { ...membership, // 保留原有的其他字段 serviceObj: serviceObj, // 如果不需要原始的services字段,可以在这里删掉: // services: undefined }; }); }; // 调用函数转换数据 const finalData = transformToTargetStructure(rawSQLData); console.log(finalData);
关键细节说明
- 为什么不用filter?:
filter的作用是从数组里筛选符合条件的元素,而你现在需要的是转换每个元素的结构,所以map才是正确的工具。 - 处理名称里的冒号:如果你的服务名称可能包含冒号(比如
"VIP:专属服务"),直接用split(':')取前两个元素会把名称拆坏,所以用[idStr, ...nameSegments]把冒号后面的所有部分收集起来再合并。 - id类型转换:SQL返回的id通常是字符串类型,所以用
parseInt转成数字,和你示例里的结构保持一致。
运行上面的代码后,finalData就会和你给出的示例结构完全一致啦。
内容的提问来源于stack exchange,提问作者Rohan Singh
相关产品推荐
相关产品推荐

