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

基于键过滤对象:如何将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);

关键细节说明

  1. 为什么不用filter?:filter的作用是从数组里筛选符合条件的元素,而你现在需要的是转换每个元素的结构,所以map才是正确的工具。
  2. 处理名称里的冒号:如果你的服务名称可能包含冒号(比如"VIP:专属服务"),直接用split(':')取前两个元素会把名称拆坏,所以用[idStr, ...nameSegments]把冒号后面的所有部分收集起来再合并。
  3. id类型转换:SQL返回的id通常是字符串类型,所以用parseInt转成数字,和你示例里的结构保持一致。

运行上面的代码后,finalData就会和你给出的示例结构完全一致啦。

内容的提问来源于stack exchange,提问作者Rohan Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:43:03