在Javascript中循环使用具有不同签名的函数数组的最佳实践?
我有一个javascript函数数组在Javascript中循环使用具有不同签名的函数数组的最佳实践?,javascript,arrays,function,Javascript,Arrays,Function,我有一个javascript函数数组Functs=[f1,f2,f3…],我想在数组上循环,按顺序执行每个函数 Edit:目前,我们确实有在循环中显式调用的函数,而(true){f1(a,b,c);f2(b);f3(c)…}。但是,我们希望使此管道可扩展,以便用户可以在任何阶段向管道中插入自定义函数,方法是提供一个公共方法,用于将项插入数组中,从而:while(true){f1(a,b,c);f2(b);fCustom(b,c);f3(c)…}。因此,外部可编辑的管道。也许有更好的方法可以做到这
Functs=[f1,f2,f3…]
,我想在数组上循环,按顺序执行每个函数
Edit:目前,我们确实有在循环中显式调用的函数,而(true){f1(a,b,c);f2(b);f3(c)…}
。但是,我们希望使此管道可扩展,以便用户可以在任何阶段向管道中插入自定义函数,方法是提供一个公共方法,用于将项插入数组中,从而:while(true){f1(a,b,c);f2(b);fCustom(b,c);f3(c)…}
。因此,外部可编辑的管道。也许有更好的方法可以做到这一点,但是一个可编辑的函数数组似乎是最简单的方法
问题是,每个函数都有不同的签名,需要不同的输入,例如:
f1 = function(name, address, date) {};
f2 = function(name, age) {};
f3 = function(height);
这些函数将循环如下:
mainFunction() {
let name = something;
let address = something;
let date = something;
....
let height = something;
while(condition == true) {
for(f in Functs) {
f(?????); //Each f() has a different signature?
}
}
}
如何确保可以将所需参数传递给每个函数?我在想类似这样的事情,用一个parameters对象将函数包装在里面,但不知道这会有多干净。至少函数可以保留其唯一的签名,但这似乎仍然是一个难题
编辑:给定值列表(名称、年龄、日期等),每个函数都在顺序管道中处理此数据块。可能有一个函数会检查年龄
值,如果它满足某个条件,则修改日期
。下一个函数将查看name
和date
函数,并以某种方式对它们进行操作,然后用结果覆盖name
。直到管道中的一个阶段(可能在几个循环之后)检测到所有内容都已完全处理。因此,每个阶段都需要能够改变这些参数,以便序列中的下一个函数可以看到这些变化,即:f2=function(height){height+=2;}
f3=function(name,age,height){if(height>age)condition=false;}
mainFunction() {
let params = {
name : something,
address : something,
date : something,
...
height : something
};
f1 = function(params) {
f1Inner = function (params.name, params.address, params.date) {};
}
Functs = [f1, f2, f3...]
while(condition == true) {
for(f in Functs) {
f(params);
}
}
}
我会将函数更改为接受单个参数作为对象,该对象会被解构,因此可以使用相同的参数调用所有函数:
mainFunction() {
let name = something;
let address = something;
let date = something;
....
let height = something;
const paramsObj = { name, address, date, height };
for (const fn of Functs) {
fn(paramsObj);
// do whatever you need to do with the return value or loop logic
}
及
如果需要在传递这些参数的同时对其进行修改,则可以在第一行中对其进行分解,从而允许您修改params对象,例如:
f1 = function(params) {
const { name, address, date } = params;
if (someCondition) {
params.height += 2;
}
};
随后的调用将看到已更改的参数。我会将函数更改为接受单个参数作为对象,该对象将被分解,以便可以使用相同的参数调用所有函数:
mainFunction() {
let name = something;
let address = something;
let date = something;
....
let height = something;
const paramsObj = { name, address, date, height };
for (const fn of Functs) {
fn(paramsObj);
// do whatever you need to do with the return value or loop logic
}
及
如果需要在传递这些参数的同时对其进行修改,则可以在第一行中对其进行分解,从而允许您修改params对象,例如:
f1 = function(params) {
const { name, address, date } = params;
if (someCondition) {
params.height += 2;
}
};
然后后续调用将看到更改的参数。
const if_then=(if_fn,then_fn)=>(params_object)=>
如果是fn(参数对象)?然后_fn(params_object):null;
const apply_params=(fn,arg_key,write_to_key=false)=>(params_object)=>{
const result=fn(…参数keys.map((v)=>参数对象[v]);
if(将\写入\键)
params_对象[将_写入_键]=结果;
返回结果;
};
const name_和_age=(name,age)=>name+‘是’+age+‘一岁半’;
常量体积=(高度、宽度、深度)=>高度*宽度*深度;
常数双_高度=(高度)=>高度*2;
常数双_宽度=(宽度)=>宽度*2;
const count_loop=(params_object)=>object.assign(params_object,{loop_count:(params_object.loop_count??0)+1})
设函数=[
计数循环,
应用_参数(双_高度,['height'],'height'),
如果你那么(
(p) =>!p.姓名和年龄,
应用参数(名称和年龄,['名称','年龄'],'名称和年龄'),
),
];
const bob=true;
如果(鲍勃)
功能推送(
如果你那么(
(p) =>p.loop_计数>2,
应用_参数(双_宽度,['width'],'width'),
)
);
functs=functs.concat([
应用_参数(体积、[“高度”、“宽度”、“深度”]、“体积”),
console.log
]);
设params={
名字:“奥伯德的冷酷”,
年龄:145,
身高:2,
宽度:0.3,
深度:0.2,
};
常量应退出循环=(参数对象)=>
(params|u object.loop|u count | 0)>10 | | params|u object.height>8;
而(!应该退出循环(参数)){
forEach函数(
(f) =>f(参数)
);
};代码>
const if_then=(if_fn,then_fn)=>(params_object)=>
如果是fn(参数对象)?然后_fn(params_object):null;
const apply_params=(fn,arg_key,write_to_key=false)=>(params_object)=>{
const result=fn(…参数keys.map((v)=>参数对象[v]);
if(将\写入\键)
params_对象[将_写入_键]=结果;
返回结果;
};
const name_和_age=(name,age)=>name+‘是’+age+‘一岁半’;
常量体积=(高度、宽度、深度)=>高度*宽度*深度;
常数双_高度=(高度)=>高度*2;
常数双_宽度=(宽度)=>宽度*2;
const count_loop=(params_object)=>object.assign(params_object,{loop_count:(params_object.loop_count??0)+1})
设函数=[
计数循环,
应用_参数(双_高度,['height'],'height'),
如果你那么(
(p) =>!p.姓名和年龄,
应用参数(名称和年龄,['名称','年龄'],'名称和年龄'),
),
];
const bob=true;
如果(鲍勃)
功能推送(
如果你那么(
(p) =>p.loop_计数>2,
应用_参数(双_宽度,['width'],'width'),
)
);
functs=functs.concat([
应用_参数(体积、[“高度”、“宽度”、“深度”]、“体积”),
console.log
]);
设params={
名字:“奥伯德的冷酷”,
年龄:145,
身高:2,
宽度:0.3,
深度:0.2,
};
常量应退出循环=(参数对象)=>
(params|u object.loop|u count | 0)>10 | | params|u object.height>8;
而(!应该退出循环(参数)){
forEach函数(
(f) =>f(参数)
);
};代码>经过大量测试和基准测试,我们想出的最快方法是(使用@certainPerformance的解决方案作为起点):
将函数存储在