You need to enable JavaScript to run this app. 如何将带参数的函数本身作为参数传递,实现JS数据查询相关工具函数
优惠活动
大模型
产品
解决方案
定价
更多

如何将带参数的函数本身作为参数传递,实现JS数据查询相关工具函数

JavaScript 实现结构化对象列表查询功能

你遇到的核心问题是需要给处理函数预传参数,只需要把select、field_filter实现为高阶函数即可:调用时先接收配置参数,返回一个实际处理数组的闭包,就能匹配你想要的调用形式。

完整实现代码如下:

const friends = [
  {'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
  {'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]

// 查询主函数
const query = function(arr, ...handlers) {
  let current = arr
  for (const handler of handlers) {
    // 绑定当前数组为this执行处理函数,更新当前结果
    current = handler.call(current)
  }
  return current
}

// 选择指定字段的高阶函数
const select = function(...fields) {
  // 返回实际处理数组的闭包
  return function() {
    return this.map(item => {
      const newItem = {}
      fields.forEach(field => newItem[field] = item[field])
      return newItem
    })
  }
}

// 字段过滤的高阶函数
const field_filter = function(field, ...allowedValues) {
  // 返回实际处理数组的闭包
  return function() {
    return this.filter(item => allowedValues.includes(item[field]))
  }
}

测试运行:

const result = query(
  friends,
  select('name', 'gender', 'sport'),
  field_filter('sport', ...['Basketball', 'volleyball']),
  field_filter('gender', ...['male'])
)

console.log(result)
// 输出:[ { name: 'Sam', gender: 'male', sport: 'Basketball' } ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 13:21:02