如何实现仅保留指定字符集内字符的对象保存功能?
嘿,这个需求其实就是典型的字符白名单过滤场景——只保留你指定的字符,把所有不在白名单里的内容全部移除。我给你整理了清晰的实现思路和多语言示例,直接就能套用:
核心思路
核心逻辑很简单:
- 遍历目标对象的所有属性(包括嵌套的数组、子对象)
- 对每个字符串类型的内容,逐个检查字符是否在白名单内,只保留符合要求的字符
- 非字符串类型(比如数字、布尔值)可以直接保留,或者根据需求转成字符串后再过滤
示例实现
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
相关产品推荐
相关产品推荐

