使用Array.filter()按参数筛选数组报错:[object Array] is not a function
问题分析:Array.filter 报错 "[object Array] is not a function"
问题描述
使用数组filter()方法时,试图通过函数参数筛选数组,但触发报错:[object Array] is not a function at Array.filter,代码如下:
function betweenArray(c, d){ let filterNumbers = arr.filter(function(currentElement) { if (currentElement >= c && currentElement <= d) return currentElement }) return filterNumbers } let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(arr.filter(betweenArray(4, 10))); // 预期输出: 4,5,6,7,8,9,10
错误原因
- 函数返回值类型不匹配:
betweenArray函数内部直接调用arr.filter并返回了一个数组,但Array.filter()方法要求传入的参数是回调函数(返回布尔值的函数),而不是数组。当你执行betweenArray(4,10)时,它返回的是过滤后的数组,把数组传给filter()自然会报错“数组不是函数”。 - 回调函数逻辑不规范:原代码中
filter的回调返回currentElement,虽然非0数值会被视为true,但filter的回调需要明确返回布尔值来决定元素是否保留,直接返回判断结果才是正确逻辑。
修正后的代码
function betweenArray(c, d){ // 返回一个符合filter要求的回调函数 return function(currentElement) { // 直接返回布尔值判断结果 return currentElement >= c && currentElement <= d; } } let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(arr.filter(betweenArray(4, 10))); // 输出: [4,5,6,7,8,9,10]
补充说明
- 修正后的
betweenArray是高阶函数:它接收范围参数c和d,返回一个用于filter的回调函数,这个回调函数通过闭包特性访问外部的c和d。 filter的回调必须返回布尔值,明确的条件判断表达式currentElement >= c && currentElement <= d直接返回true或false,逻辑清晰且符合方法要求。
内容的提问来源于stack exchange,提问作者Isaac Covarrubias
相关产品推荐
相关产品推荐

