You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何传递变量作为数组filter方法的过滤条件?

解决数组过滤时传递额外参数的问题

你代码里的核心错误是searchFirstNames函数的写法:namesAr.filter(filterFirstName)(fullNames, "John")完全不符合逻辑——filter调用后返回的是过滤后的数组,不是函数,后面加括号调用必然会报"not a function"的错误。

下面是几种可行的解决方法,帮你把nameQuery参数传递到过滤逻辑里:

方法1:用匿名函数包装回调

直接在filter内部写匿名函数,把当前遍历到的元素和nameQuery一起传给你的判断函数:

var searchFirstNames = (namesAr, nameQuery) =>
  namesAr.filter(fullName => filterFirstName(fullName, nameQuery));

这种方式最简单直观,匿名函数作为filter的回调,会自动接收当前元素,再把它和外部的nameQuery一起传给filterFirstName做判断。

方法2:用bind绑定额外参数

通过bind把nameQuery绑定到filterFirstName的参数上,注意要调整判断函数的参数顺序(因为bind会把绑定的参数前置):

// 先调整filterFirstName的参数顺序,把查询条件放前面
var filterFirstName = (nameQuery, fullName) =>
  fullName.split(" ")[0] === nameQuery;

var searchFirstNames = (namesAr, nameQuery) =>
  namesAr.filter(filterFirstName.bind(null, nameQuery));

bind(null, nameQuery)会创建一个新函数,把nameQuery作为第一个参数固定住,filter遍历元素时会把当前元素作为第二个参数传入,刚好匹配调整后的函数参数。

方法3:用高阶函数返回闭包

把filterFirstName改成高阶函数,让它返回一个捕获了nameQuery的闭包函数,这个闭包可以直接作为filter的回调:

// 高阶函数,接收查询条件后返回判断函数
var filterFirstName = (nameQuery) => 
  (fullName) => fullName.split(" ")[0] === nameQuery;

var searchFirstNames = (namesAr, nameQuery) =>
  namesAr.filter(filterFirstName(nameQuery));

这种方式更灵活,filterFirstName(nameQuery)会生成一个专门针对该查询条件的判断函数,完全符合filter回调的参数要求。

完整修正代码示例(方法1)

// 生成随机名字数组,包含John Smith
var fullNames = (() => {
  let names = [];
  for (let i = 0; i < 9; i++) {
    names.push(`Human${i} Person${i}`);
  }
  names.push("John Smith");
  return names;
})();

// 判断全名的 firstName 是否匹配查询条件
var filterFirstName = (fullName, nameQuery) =>
  fullName.split(" ")[0] === nameQuery;

// 过滤数组的函数
var searchFirstNames = (namesAr, nameQuery) =>
  namesAr.filter(fullName => filterFirstName(fullName, nameQuery));

// 调用测试
console.log(searchFirstNames(fullNames, "John")); // 输出 ["John Smith"]

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:01:10