我需要将查询字符串转换为对象,但具有相应的数据类型。让我更好地解释一下:我使用外部服务中的表,该表在添加过滤器时会生成过滤器。我需要将这些过滤器放入查询字符串中,然后读回它们。当我读回它们时,我需要每种类型返回到其初始状态。例如,如果在将查询放入查询字符串之前{ foo: 10 }
,我需要它在读回时具有相同的内容,而不是{ foo: "10" }
。但是,我们知道查询字符串实际上是一个字符串,当我将其转换回来时,JSON 属性的值仍然是字符串。我并不是要求您为我创建一个方法来执行此操作,但我想知道您是否知道更简单的方法,例如某些实用程序。
我开始写这个方法:
const parseStringToJson = (str: string | null | undefined): object => {
// str is skip=0&take=10
const parsedJSON: any = QueryString.parse(str || {});
// parsedJSON is { skip: "0", take: "10"}
const convertDataType = (data: object | null): void => {
Object.entries(data || {}).forEach(([key, value]) => {
let isNumber = (typeof value === 'number' || (typeof value === 'string' && !isNaN(parseFloat(value))));
let isBoolean = value === 'true' || value === 'false';
//value is number
if (isNumber) {
return (parsedJSON[key] = Number(value));
}
//value is boolean
if (isBoolean) {
return (parsedJSON[key] = value === 'true');
}
//value is string
if (typeof value === 'string' && !isNumber) {
return (parsedJSON[key] = value);
}
});
};
convertDataType(parsedJSON);
// parsedJSON is { skip: 0, take: 10}
return parsedJSON;
};
其中QueryString是从qs导入的
这仅适用于一层对象,但我需要深入内部。还管理阵列。
所以在我开始这样做之前,你有更好的主意吗?
你的
parsedJSON
不是JSON (它已经是一个普通的对象),所以你所问的似乎是一个措辞不佳的“如果这就是字符串,我如何自动将字符串转换为其他数据类型”。具有讽刺意味的是,这里的答案之一(如果您不想使用模式库,您可能应该这样做)是创建对象的实际JSON 字符串表示形式,使用动态转换值的替换函数(因为 JSON .stringify 是一个树遍历器),然后将结果从 JSON 解析回普通对象:
这是一个好的解决方案吗?不。使用可以提取字符串数据并自动将其转换为应有的数据类型的模型/架构解决方案。通过模型验证,如果您尝试创建不完整或不兼容的模型实例,您可以捕获它并在输入失败时执行您需要执行的操作。
这是一个有趣的解决方案吗?绝对地。使用树遍历对象
JSON.stringify
是 JS 的隐藏奖励功能之一。从字符串中识别数字的图示。