如何用JavaScript for循环实现Array.every与Array.some的功能
用for循环实现Array.every和Array.some方法
我想用for循环实现Array.every和Array.some的数组校验逻辑。这两个数组方法的作用是检测数组元素是否通过测试回调:
every方法:所有元素都通过测试则返回true,否则返回false;some方法:只要有一个元素通过测试就返回true,否则返回false。
我已经写了部分代码,但逻辑有问题,以下是我目前的代码:
var every = function (array, test) { // Your implementation below for (let i = 0; i < array.length; i++) { const test = array[i] console.log(item) if (test <= 1) { largerThan1 = false return } return // true or false } var some = function (array, test) { // Your implementation below for (let i = 0; i < array.length; i++) { const test = array[i] console.log(item) if (test <= 10) { largerThan10 = false return } return // true or false } var largerThan = function (target) { return function (number) { return number > target; } } console.log(every([10, 20, 30], largerThan(1))); // → true console.log(every([10, 20, 30], largerThan(10))); // → false // console.log(some([10, 20, 30], largerThan(10))); // // → true // console.log(some([10, 20, 30], largerThan(30))); // // → false
代码问题分析
你写的代码存在几个关键问题:
- 覆盖回调参数:在循环里用
const test = array[i]把传入的测试回调函数覆盖了,导致根本没法调用外部传入的校验逻辑; - 未声明变量:
item、largerThan1、largerThan10都是未定义的变量,运行时会直接报错; - 循环逻辑错误:
return语句写在循环内部,第一次循环就直接返回了,根本没遍历完数组; - 硬编码校验规则:把
test <=1这类固定逻辑写死了,失去了方法的通用性,没法适配不同的测试回调。
正确实现代码
var every = function (array, test) { // 遍历数组每一项 for (let i = 0; i < array.length; i++) { // 只要有一项不通过测试,立即返回false if (!test(array[i])) { return false; } } // 所有项都通过,返回true return true; }; var some = function (array, test) { // 遍历数组每一项 for (let i = 0; i < array.length; i++) { // 只要有一项通过测试,立即返回true if (test(array[i])) { return true; } } // 所有项都不通过,返回false return false; }; var largerThan = function (target) { return function (number) { return number > target; }; }; // 测试验证 console.log(every([10, 20, 30], largerThan(1))); // → true console.log(every([10, 20, 30], largerThan(10))); // → false console.log(some([10, 20, 30], largerThan(10))); // → true console.log(some([10, 20, 30], largerThan(30))); // → false
实现说明
every:遍历过程中只要碰到不满足测试回调的元素,就立刻返回false;等所有元素都遍历完且都满足条件,才返回true;some:遍历过程中只要碰到满足测试回调的元素,就立刻返回true;等所有元素都遍历完且都不满足条件,才返回false;- 完全复用传入的
test回调,没有硬编码规则,能适配任意自定义的校验逻辑。
内容的提问来源于stack exchange,提问作者la10nay
相关产品推荐
相关产品推荐

