javascript - 如何传递带有参数的函数作为参数本身?
问题描述
我有一个像这样的对象列表:
friends = [
{'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
{'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]
我需要创建函数“query”、“select”和“field_filter”来处理这些列表。所有这些都应该看起来像这样:
»> result = query(
friends,
select('name', 'gender', 'sport'),
field_filter('sport', *('Basketball', 'volleyball')),
field_filter('gender', *('male',)),
)
»> result
[{'gender': 'male', 'name': 'Sam', 'sport': 'Basketball'}]
我的想法是创建一个查询函数,它以数组和...函数作为参数,并以数组作为上下文来调用此函数。当我按原样传递函数时,我设法做到了这一点,即没有参数,但正如你所看到的,它应该使用参数传递
现在我的代码如下所示:
let friends = [
{'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
{'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]
const query = function(arr, ...funcs) {
for (i of funcs) {
i.call(arr)
}
}
const select = function(...args) {
console.log(this)
}
query(friends, select, select, select)
PS Initialy这个任务是为python做的,但我想在JS上做
解决方案
我发现完美解决这个问题的答案是闭包:如果函数立即运行并在错误的上下文中执行主体 - 它应该返回一个接受参数并在适当的上下文中调用的函数。这就是我的意思:
编辑:显然它不是闭包,但概念是相同的 - 我返回函数需要适当的上下文
let friends = [
{'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
{'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]
const query = function(arr, ...funcs) {
for (i of funcs) {
i.call(arr) // calls a function with proper context
}
}
function select(...args) {
return function() { // return a function which is being called inside query function
// body of a function, e.g. console.log(this, args)
}
}
let result = query(
friends,
select('name', 'gender') // works perfectly
)
随意指出一些错误/不好的做法。毕竟我连小学生都不是:)
推荐阅读
- node.js - 为什么 Chrome 不在生产中设置 cookie
- html - 防止无序列表引起的“换行符”
- javascript - React @redux/toolkit 在状态更新时不会重新渲染组件
- dynamics-crm - Dynamics crm + 插件代码,用于跨实体集合存储总和公式
- sql - SQL/Presto:如何在 ds 上获取项目开始时间的累积总和
- flutter - 在 Flutter 中初始化堆上的 State 属性与 initState 函数
- python - 尝试在 Selenium 中设置窗口,而不是我将它们选项卡到 1 个浏览器窗口中
- node.js - Mocha:无法在另一个测试文件中已经需要的文件中存根函数
- python - 在父项目上运行 pytest 时,如何忽略 git 子模块(例如 submodule/conftest.py)根目录下的 conftest.py 文件?
- assembly - 在汇编程序中消除对 -no-pie 的需要