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

如何实现仅保留指定字符集内字符的对象保存功能?

嘿,这个需求其实就是典型的字符白名单过滤场景——只保留你指定的字符,把所有不在白名单里的内容全部移除。我给你整理了清晰的实现思路和多语言示例,直接就能套用:

核心思路

核心逻辑很简单:

  • 遍历目标对象的所有属性(包括嵌套的数组、子对象)
  • 对每个字符串类型的内容,逐个检查字符是否在白名单内,只保留符合要求的字符
  • 非字符串类型(比如数字、布尔值)可以直接保留,或者根据需求转成字符串后再过滤
示例实现

Python 版本

这个实现支持递归处理嵌套对象、数组,适配大部分常见场景:

def filter_object_by_whitelist(obj, allowed_chars):
    # 处理字符串:仅保留白名单内的字符
    if isinstance(obj, str):
        return ''.join([char for char in obj if char in allowed_chars])
    # 处理数组/列表:递归过滤每个元素
    elif isinstance(obj, list):
        return [filter_object_by_whitelist(item, allowed_chars) for item in obj]
    # 处理字典/对象:递归过滤每个键值对(如需过滤键名,对key做同样处理即可)
    elif isinstance(obj, dict):
        return {
            key: filter_object_by_whitelist(value, allowed_chars)
            for key, value in obj.items()
        }
    # 其他类型(数字、布尔等)直接返回
    else:
        return obj

# 测试用例:白名单仅包含大小写字母和空格
allowed_chars = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ')
test_obj = {
    "name": "Matias<>&Andres",
    "bio": "Hello! I'm a developer. My email is test@example.com",
    "age": 30,
    "hobbies": ["coding<", "reading>"]
}

filtered_result = filter_object_by_whitelist(test_obj, allowed_chars)
print(filtered_result)

运行后,name字段会被处理成Matias Andres,其他含非法字符的内容也会被自动清理。

JavaScript 版本

同样支持嵌套结构处理,前端后端都能用:

function filterObjectByWhitelist(obj, allowedChars) {
    const allowedSet = new Set(allowedChars);
    
    // 处理字符串
    if (typeof obj === 'string') {
        return [...obj].filter(char => allowedSet.has(char)).join('');
    }
    // 处理数组
    if (Array.isArray(obj)) {
        return obj.map(item => filterObjectByWhitelist(item, allowedSet));
    }
    // 处理对象(排除null和函数类型)
    if (typeof obj === 'object' && obj !== null && typeof obj !== 'function') {
        const filteredObj = {};
        for (const [key, value] of Object.entries(obj)) {
            filteredObj[key] = filterObjectByWhitelist(value, allowedSet);
        }
        return filteredObj;
    }
    // 其他类型直接返回
    return obj;
}

// 测试用例
const allowedChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ '.split('');
const testObj = {
    name: "Matias<>&Andres",
    bio: "Hello! I'm a developer. My email is test@example.com",
    age: 30,
    hobbies: ["coding<", "reading>"]
};

const filteredResult = filterObjectByWhitelist(testObj, allowedChars);
console.log(filteredResult);
注意事项
  • 如果需要过滤对象的键名而非仅仅是值,只需要在处理字典/对象时,对key也执行同样的白名单过滤逻辑即可
  • 白名单字符可以灵活调整:比如需要允许数字、特定标点,直接把对应的字符添加到allowed_chars里就行
  • 若你是处理序列化后的JSON字符串,建议先把JSON解析成对象再处理,避免直接过滤字符串破坏JSON结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:47:49