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

TypeScript中带类型转换的查询字符串解析:求更优实现方案

如何将查询字符串解析为保留原始数据类型的嵌套对象/数组

你可以直接基于qs库扩展,通过递归转换逻辑处理嵌套对象和数组——qs本身就支持解析嵌套结构,不用自己从零实现复杂的字符串拆分逻辑,只需要加上类型转换的递归处理即可。

完整实现代码

import qs from 'qs';

const parseQueryString = (str: string | null | undefined): object => {
  const convertValue = (value: any): any => {
    // 转换布尔值字符串
    if (value === 'true') return true;
    if (value === 'false') return false;
    
    // 转换纯数字字符串:先验证是否为纯数字格式,避免误转带数字的普通字符串
    if (typeof value === 'string') {
      const num = Number(value);
      if (!isNaN(num) && !isNaN(parseFloat(value))) {
        return num;
      }
    }

    // 递归处理嵌套对象和数组
    if (typeof value === 'object' && value !== null) {
      if (Array.isArray(value)) {
        return value.map(convertValue);
      }
      return Object.fromEntries(
        Object.entries(value).map(([key, val]) => [key, convertValue(val)])
      );
    }

    // 其他类型直接返回
    return value;
  };

  // 先用qs解析嵌套结构和数组,再做全局类型转换
  const parsedBase = qs.parse(str || '', {
    allowDots: true,    // 支持 `filter.name=Alice` 这种点语法的嵌套对象
    parseArrays: true,  // 支持 `ids[]=1&ids[]=2` 这种数组格式
    strictNullHandling: true // 可选:将字符串"null"转换为null类型
  });

  return convertValue(parsedBase);
};

核心逻辑说明

  1. 嵌套结构解析:借助qs.parse的allowDots和parseArrays配置,自动识别并解析嵌套对象(如a.b.c=123)、数组(如tags[]=js&tags[]=ts),省去手动拆分字符串的麻烦。
  2. 递归类型转换:convertValue函数会遍历所有层级的属性,将字符串格式的布尔值、纯数字转换为对应原始类型,同时递归处理嵌套的对象和数组。
  3. 防误转换处理:判断数字时先验证字符串是否为纯数字格式,避免把"123abc"这类带数字的普通字符串误转为数字。

示例测试

输入查询字符串:

skip=0&take=10&filter.active=true&ids[]=1&ids[]=2&user.name=John

解析后得到的对象:

{
  skip: 0,
  take: 10,
  filter: { active: true },
  ids: [1, 2],
  user: { name: "John" }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:25:58