JavaScript:如何优化非硬编码的数组仅含指定值检查函数?
优化数组检查函数,摆脱硬编码值限制
嘿,我来帮你搞定这个函数的优化!当前的函数只能固定接受两个目标值,扩展性太差了——要是哪天需要检查数组只包含3个甚至更多值,难道还要改函数参数吗?咱们来彻底解决这个问题,同时顺便修复原函数里的一些小坑。
先聊聊原函数的问题
原函数存在几个潜在问题:
- 硬编码参数限制:只能接受
value1和value2两个允许值,无法灵活处理更多情况 - 全局变量污染:循环里的
i没有用var/let/const声明,会变成全局变量,容易引发意外问题 - 空数组处理模糊:如果传入空数组,
result会是undefined,最后会返回true,这个逻辑是否符合需求不明确 - 冗余的result变量:其实可以直接在循环里返回结果,不用额外维护这个变量
优化方案:支持任意数量的允许值
我们可以用ES6的剩余参数来让函数接受任意数量的允许值,再结合Set来提升查找效率,最后用更简洁的逻辑实现需求。
版本1:循环实现(可读性强)
function containOnly(array, ...allowedValues) { // 先明确空数组的处理逻辑,这里假设空数组符合"仅包含指定值"的条件,可根据需求修改 if (array.length === 0) return true; // 把允许值存入Set,查找时间从O(n)优化到O(1) const allowedSet = new Set(allowedValues); for (const item of array) { // 只要发现一个不在允许列表里的元素,直接返回false if (!allowedSet.has(item)) { return false; } } // 所有元素都符合条件,返回true return true; } // 测试用例 console.log(containOnly([2,1,2], 1, 2)); // true console.log(containOnly([1,2,3], 1,2)); // false console.log(containOnly([], 5)); // true(空数组按符合条件处理) console.log(containOnly(['a','b','a'], 'a','b')); // true
版本2:用数组every方法(更简洁)
如果喜欢更简洁的代码,可以用数组的every方法,它会自动遍历数组并检查每一项是否满足条件:
function containOnly(array, ...allowedValues) { const allowedSet = new Set(allowedValues); // every方法:所有元素满足条件返回true,否则返回false;空数组会直接返回true return array.every(item => allowedSet.has(item)); }
优化点说明
- 摆脱硬编码限制:
...allowedValues剩余参数让你可以传入任意数量的允许值,比如containOnly([1,3,3], 1,3)或者containOnly(['x'], 'x','y','z')都能正常工作 - 性能提升:用
Set存储允许值,查找元素的时间复杂度从O(n)降到O(1),当允许值数量较多时,性能提升明显 - 修复潜在bug:用
const声明变量,避免全局变量污染;明确空数组的处理逻辑 - 代码更简洁:去掉冗余的
result变量,逻辑更清晰,可读性更高
内容的提问来源于stack exchange,提问作者gigs
相关产品推荐
相关产品推荐

