如何验证乱序用户输入含全部所需信息及数字排列相等?
解决方案:验证字符串排列与检查输入完整性
一、验证字符串是否为'123456'的任意排列
方法1:排序后直接比较
排列后的字符串,只要字符组成和原字符串完全一致,排序后必然和原字符串相同。这种方法简单直观,适合短字符串场景。
function isPermutationOfTarget(inputStr) { const target = '123456'; // 长度不一致直接排除 if (inputStr.length !== target.length) return false; // 拆分、排序后拼接成字符串对比 return inputStr.split('').sort().join('') === target.split('').sort().join(''); } // 测试用例 console.log(isPermutationOfTarget('213456')); // true console.log(isPermutationOfTarget('12345')); // false console.log(isPermutationOfTarget('123457')); // false
方法2:统计字符频率
如果处理长字符串,排序的性能可能不如统计字符出现次数。这种方法通过计数对比,能更高效判断字符组成是否一致。
function isPermutationOfTarget(inputStr) { const target = '123456'; if (inputStr.length !== target.length) return false; const charCount = {}; // 统计目标字符串的字符频次 for (const char of target) { charCount[char] = (charCount[char] || 0) + 1; } // 遍历输入字符串,抵消频次 for (const char of inputStr) { if (!charCount[char]) return false; // 出现目标没有的字符直接返回false charCount[char]--; } // 检查所有字符频次是否清零 return Object.values(charCount).every(count => count === 0); }
二、检查用户输入是否包含全部所需信息(顺序不限)
场景1:输入为字符串,需包含指定关键词
比如要确认输入字符串同时包含name、email、phone三个关键词:
function hasAllRequiredKeywords(inputStr, requiredKeywords) { // 遍历所有关键词,检查是否都在输入中存在 return requiredKeywords.every(keyword => inputStr.includes(keyword)); } // 测试用例 const required = ['name', 'email', 'phone']; console.log(hasAllRequiredKeywords('我的邮箱是xxx@xxx.com,姓名John,电话123', required)); // true console.log(hasAllRequiredKeywords('我的姓名John,邮箱xxx@xxx.com', required)); // false
场景2:输入为数组,需包含指定元素集合
如果用户输入是数组(比如表单提交的字段列表),可以用集合来判断子集关系:
function hasAllRequiredItems(inputArray, requiredItems) { const inputSet = new Set(inputArray); return requiredItems.every(item => inputSet.has(item)); } // 测试用例 const required = ['name', 'email', 'phone']; console.log(hasAllRequiredItems(['email', 'name', 'phone'], required)); // true console.log(hasAllRequiredItems(['name', 'email'], required)); // false
关于你之前的正则问题
你写的if(userInput = [/answer/g] return true)存在两个核心问题:
- 语法错误:赋值运算符
=误用为比较,且正则的调用方式完全错误,不能直接将数组与正则表达式对比。 - 逻辑适配问题:正则更适合匹配特定模式,而非判断是否包含全部目标元素。如果硬要用正则实现关键词全匹配,需要写复杂的正向预查,但可读性极差:
// 示例:检查是否同时包含name、email、phone(忽略大小写) const regex = /^(?=.*name)(?=.*email)(?=.*phone).*$/i; console.log(regex.test('name: John, email: xxx@xxx.com, phone: 123')); // true
这种方式仅适合极简单的场景,关键词数量增加或包含特殊字符时,正则会变得难以维护,所以更推荐前面的every结合includes或集合的方案。
内容的提问来源于stack exchange,提问作者risel
相关产品推荐
相关产品推荐

